首页 > 解决方案 > 字符显然没有在 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", 的 ASCII 值替换它A0x41它会按预期工作并打印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 值?

标签: cosdevfreestanding

解决方案


*vidMem = "A";

这相当于

vidMem[0] = "A";

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

你想做:

vidMem[0] = 'A';

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


推荐阅读