字符显然不会在 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"
替换为 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
文字。
我正在 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
文字。