我有一个简单的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字符。
答案 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));
}
作为参数。