расширенные символы ASCII, не работающие в int 10h - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть простая ОС (реальный режим), написанная на 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 голосов
/ 13 декабря 2018

Проблема проста.В 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, как предложенов комментариях.

...