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

时间:2017-01-07 08:12:34

标签: c kernel osdev

我正在开发一个OS内核。我在向屏幕打印扩展的ASCII字符时遇到问题。当我尝试在屏幕上打印字符时,一般的ascii字符很容易打印成白色。但是当我尝试打印像块,西格玛等扩展的ASCII字符时,它会以黄色打印。而是使用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

我本可以使用颜色+ 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;
}

1 个答案:

答案 0 :(得分:3)

问题很可能就在这里:

(attr<<8)+character

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

相关问题