字符显然没有在 C 内核中转换为其 ASCII 值



我正在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文字。

最新更新