c - 扩展的 ASCII 字符以黄色而不是白色打印 - OSDev

标签 c kernel osdev

我正在开发操作系统内核。我在将扩展 ASCII 字符打印到屏幕时遇到问题。当我尝试在屏幕上打印字符时,一般的 ascii 字符很容易以白色打印出来。但是当我尝试打印扩展的 ASCII 字符(如 blocks、sigma 等)时​​,它以黄色打印。相反,这些字符使用 color's number - 1 打印。

WHITE -> YELLOW
YELLOW -> BRIGHT MAGENTA
BRIGHT MAGENTA -> BRIGHT RED
.
.
and so on

谁能告诉我为什么会这样并帮助我解决这个问题?

我的代码是这样的-

putChar(0xdb,0,3,color(BLACK,BLACK));
putChar('A',2,3,color(WHITE,BLACK));

putChar(228,0,4,color(B_GREEN,BLUE));
putChar('A',2,4,color(B_GREEN,BLUE));

putChar(228,0,5,color(B_MAGENTA,BLUE));
putChar('A',2,5,color(B_MAGENTA,BLUE));

输出是-

The Output

我本可以使用 color+1 代码,但白色之上没有任何东西。我怎样才能将它们打印成白色?

编辑 - putChar 代码

void putChar(char character, short col, short row, unsigned char attr) {
    volatile unsigned char* vid_mem = (unsigned char *) VIDEO_MEM;
    int offset = (row*80 + col)*2;
    vid_mem += offset;
    if(!attr) {
        attr = default_color;
    }
    *(unsigned short int *)vid_mem = (attr<<8)+character;
}

最佳答案

很可能问题出在这里:

(attr<<8)+character

在 x86 gcc 中类型 char默认情况下已签名。因此,当您传递代码为 0x80 ... 0xFF 的字符时,这些字符将被视为已签名并在添加之前进行符号扩展。因此,对于这些字符,您实际上得到了 (attr<<8)+0xFFFFFF80 ... (attr<<8)+0xFFFFFFFF .并添加 0xFF00(attr<<8)attr 中有效地减去 1 .

关于c - 扩展的 ASCII 字符以黄色而不是白色打印 - OSDev,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519336/

相关文章:

c - 启用分页时 QEMU 三重故障

c - 自制内核中的三重故障

operating-system - 我应该制作自己的操作系统内核 ELF 还是原始二进制文件?

c - 尝试复制共享内存地址时出现段错误

c - 打印文件中前 10 个重复出现的单词

operating-system - 除了 malloc/free 之外,程序是否需要操作系统提供其他任何东西?

matlab - 如何在 Matlab 中使用 libsvm?

c++ - 操作系统如何检测进程崩溃

c - 查找可用端口以使用 BSD 打开伪终端

android - 如何在 Android 上为 USB 传感器使用 Linux C++ 驱动程序?