我正在 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"
, 的 ASCII 值替换它A
,0x41
它会按预期工作并打印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
,所以我对为什么会收到此错误感到困惑。"A"
当我替换为时,我没有收到错误0x41
,所以我所看到的只是编译器的处理"A"
方式0x41
不同。为什么会这样?如何打印我想要的字符而不需要提供其 ASCII 值?