我正在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"
替换为A
、0x41
的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
文字。