扩展的 ASCII 字符以黄色而不是白色打印 - OSDev
Extended ASCII characters are printed in yellow instead of white - OSDev
我正在开发一个 OS 内核。我在将扩展 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));
输出为-
我本可以使用 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
我正在开发一个 OS 内核。我在将扩展 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));
输出为-
我本可以使用 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
.