Помощь в создании 16-битной ОС - PullRequest
3 голосов
/ 26 апреля 2010

Я пытаюсь собрать старую 16-битную ОС под DOS.

Мой пример кода ядра:

    asm(".code16\n");
    void putchar(char);
    int main()
    {
    putchar('A');
    return 0;
    }
    void putchar(char val)
    {
       asm("movb %0, %%al\n"  
           "movb $0x0E, %%ah\n" 
           "int $0x10\n"
          :
          :"r"(val)
          ) ;
    }

Вот как я это скомпилирую:

nasm -f bin -o ./bin/boot.bin ./source/boot.asm
gcc -nostdinc -fno-builtin -I./include -c -o ./bin/kernel.o ./source/kernel.c
ld -Ttext=0x9000 -o ./bin/kernel.bin ./bin/kernel.o -e 0x0
dd if=/dev/zero of=./bin/empty.bin bs=1440K count=1
cat ./bin/boot.bin ./bin/kernel.bin ./bin/empty.bin|head -c 1440K > ./bin/os
rm ./bin/empty.bin

и я запускаю его на виртуальной машине.

Когда я делаю функцию putchar (в коде ядра) для константного значения .... например, так:

 void putchar()
 {
    char val = 'A';
    asm("movb %0, %%al\n" 
    "movb $0x0E, %%ah\n" 
    "int $0x10\n"
    :
    :"r"(val)
    ) ;
 }

тогда все работает нормально. Но когда я передаю ему аргумент (то есть в предыдущем коде), он печатает пробел для любого символа. Что мне делать?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2010

Если вы пытаетесь заставить gcc генерировать 16-битный код, вам нужно использовать .code16gcc, а не .code16, чтобы правильно настроить параметры стека для параметров функции: см. "Запись 16- Битовый код »в газовой документации .

(Кроме того, в зависимости от используемой версии gcc может потребоваться скомпилировать kernel.c с параметром -fno-unit-at-a-time или -fno-toplevel-reorder, чтобы убедиться, что директива asm() действительно встречается ассемблер перед любым скомпилированным кодом - в противном случае компилятор может перемешать.)

1 голос
/ 29 ноября 2011

Я нашел другой компилятор для решения проблемы: ОЦК

Это C-компилятор для процессора 8086, который важен для разработки загрузчиков или кода 8086, связанного с BIOS.

...