Проблема проста.В x86 компиляторах char
это со знаком .'ñ'
, т.е. 0xA4
считается отрицательным (-92).Подписанный char
будет повышен до int
(обычные арифметические продвижения) для |
.Это происходит через расширение знака.
Результирующее значение будет, конечно, -92 (0xFFA4
), что |
ed с 0x0E00
приведет к 0xFFA4
... что будет означать, чтовместо функции AH = 0Eh мы теперь вызываем функцию AH = FFh ... если она вообще существует.
Одно из решений состоит в том, чтобы putch
принял аргумент как int
и преобразовать его в unsigned char
, точно так же как функции C putchar
& al do:
void putch(int chr)
{
__asm__ __volatile__ ("int $0x10"
:
: "a" ((0x0e<<8) | (unsigned char)chr),
"b" (0x0000));
}
Или просто заставить его принять аргумент как unsigned char
, как предложенов комментариях.