【问题标题】:Extended ASCII characters are printed in yellow instead of white - OSDev扩展的 ASCII 字符以黄色而不是白色打印 - OSDev
【发布时间】:2017-05-22 00:30:21
【问题描述】:

我正在开发一个操作系统内核。在将扩展的 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));

输出是 -

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

【问题讨论】:

  • 嗯……putChar() 中有什么内容?
  • @duskwuff 我已经添加了代码
  • 这只是符号扩展 - 要么将 character 设为 unsigned char,要么在将其添加到 attr&lt;&lt;8 之前屏蔽高位。
  • 谢谢,现在可以正常使用了!!

标签: c kernel osdev


【解决方案1】:

问题很可能在这里:

(attr<<8)+character

在 x86 gcc 中,char 类型默认是签名的。因此,当您传递代码为 0x80 ... 0xFF 的字符时,这些字符将被视为已签名并在添加之前进行符号扩展。所以,对于那些角色,你实际上得到了(attr&lt;&lt;8)+0xFFFFFF80 ...(attr&lt;&lt;8)+0xFFFFFFFF。将0xFF00 加到(attr&lt;&lt;8) 上实际上是从attr 中减去1。

【讨论】:

  • 是的,这就是问题所在。我已经纠正了它,现在它可以工作了。
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2018-12-26
  • 2011-01-09
  • 2022-01-17
相关资源
最近更新 更多