扩展ASCII字符在int 10h中不起作用

时间:2018-12-13 18:22:53

标签: c x86 nasm bootloader bios

我有一个简单的OS(实模式),用NASM(仅引导加载程序)编写,大部分使用C语言编写。

我要打印此字符:ñ,并且使用此函数,该函数使用int 10h将字符打印到屏幕上:

void putch(char chr)
{
    __asm__ __volatile__ ("int $0x10"
                          :
                          : "a" ((0x0e<<8) | chr),
                            "b" (0x0000));
}

void println(char *str)
{
    while (*str)
        putch(*str++);
}

现在,我尝试打印ñ:

println("ñ\r\n");

但是,当我编译并执行(在qemu和VB框中)时,字符“ñ”将被忽略。 我将源代码保存为CP-437编码,但问题仍然存在。 这也会影响所有扩展的ASCII字符。

1 个答案:

答案 0 :(得分:6)

问题很简单。在x86编译器中,char签名'ñ',即0xA4被认为是负数(-92)。已签名的char被提升为int的{​​{1}}(通常是算术提升)。这是通过符号扩展来实现的。

结果的值当然是-92(|),将0xFFA4|结合起来将得到0x0E00 ...,这意味着不是函数AH = 0Eh,我们现在调用函数AH = FFh ...,如果它甚至存在。

一种解决方案是让0xFFA4接受一个 putch 的参数,并将其转换为 int ,就像C功能unsigned char和其他功能:

putchar

或者像注释中所建议的那样,使它接受void putch(int chr) { __asm__ __volatile__ ("int $0x10" : : "a" ((0x0e<<8) | (unsigned char)chr), "b" (0x0000)); } 作为参数。