字符显然不会在 C 内核中转换为其 ASCII 值

Character apparently doesn't get translated to its ASCII value in a C kernel

我正在 Kali 机器上开发一个基本的 C 内核并在 QEMU 中测试它。这是内核代码:

void kernel_main();
void print();

void print() {
    char* vidMem = (char*)0xb8000;
    *vidMem = "A";
    vidMem++;
    *vidMem = 0x0f;
}

void entry() {
    kernel_main();
    while(1);
}

void kernel_main() {
    print();
}

这会打印 Z 而不是 A,但是如果我将 "A" 替换为 A0x41 的 ASCII 值,它会按预期工作并将 A 打印到屏幕上。此外,我还收到此错误:

kernel.c:6:10: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
    6 |  *vidMem = "A";
      |          ^

如果我理解正确的话,编译器会认为我试图将 vidMem 本身的值更改为不同数据类型的不同值;但是,我正在取消引用 vidMem 变量,并且只更改 vidMem 指向的内存字节,所以我很困惑为什么会出现此错误。当我用 0x41 替换 "A" 时,我没有收到错误,所以我看到的是编译器对 "A"0x41 的处理方式不同。为什么会这样?如何打印我想要的字符而不需要提供其 ASCII 值?

*vidMem = "A";

这相当于

vidMem[0] = "A";

“A”是一个字符串,而不是一个字符,因此您将字符串 "A" 的地址(最低字节)分配到该内存位置。

您想做的事情:

vidMem[0] = 'A';

注意单引号,这使它成为 char 文字。