16-битная программа .com C в реальном режиме ОС - PullRequest
3 голосов
/ 24 марта 2012

Я работал над операционной системой реального режима, писал на ассемблере и компилировал в плоские .bin исполняемые файлы с NASM.
Я хотел бы написать некоторые ОС на C, и поэтому написал экспериментальную программу (ctest.c), для которой я хотел бы получить доступ к строке и напечатать первый символ:

void test();

int main() { test(); return 0; }

char msg [] = "Hello World!";

void test() {
    _asm
    {
        mov si, word ptr [msg]
        mov al, [si]
        mov ah, 0eh
        int 10h
    }
    for(;;);
}

Я скомпилировал это с Open Watcom v1.9, используя wcl ctest.c -lr -l=COM . Это создает ctest.com. Ядро, которое я написал в сборке NASM, загружает эту программу в 0x2010: 0x0000, устанавливает DS и ES в 0x2000: 0x0000 и затем переходит к 0x2010: 0x0000. Вот как я вызывал .COM программы, написанные на ассемблере и скомпилированные с nasm -f bin test.asm -o test.com.
Когда я тестирую ОС (используя Bochs), она успешно загружает ctest.com, но выводит бессмысленный символ, который не является частью msg [].
У кого-нибудь есть предложения по этому поводу? Я думаю, что строка просто инициализируется не в том месте. Я хотел бы сохранить это как 16-битную ОС.
спасибо!

Ответы [ 2 ]

4 голосов
/ 25 марта 2012

Вы используете неправильные адреса.

Вы либо загружаете в 0x2000: 0x0100 и переходите к 0x2000: 0x0100 (не забудьте предварительно установить DS = ES = SS = 0x2000 и SP = 0) ИЛИ вы загружаете в 0x2000: 0x0000 (эквивалентно 0x1FF0: 0x0100, потому что 0x2000 * 0x10 + 0x0000 = 0x1FF0 * 0x10 + 0x0100 = 0x20000 = адрес физической памяти в реальном режиме) и переходите к 0x1FF0: 0x0100 (незабудьте настройки DS = ES = SS = 0x1FF0 и SP = 0 до этого).

Причина всего этого заключается в том, что скомпилированный код x86, как правило, не зависит от позиции, и если вы перемещаете его, вы должнынастроить некоторые смещения данных внутри кода.Очевидно, вы не вносили эти корректировки.В простых случаях нечего было настраивать, и вы ошиблись адресами.

EDIT :

На самом деле, здесь больше проблем:

  1. mov si, word ptr [msg] должен измениться на lea si, byte ptr [msg], потому что вы не хотите загружать si с тем, что находится внутри строки, вы хотите загрузить его с адресом строки.
  2. Код запуска, которыйOW, связанный с вашей программой, зависит от DOS и вызывает функции DOS, которых у вас нет при загрузке программы.Посмотрите, как обойти это здесь .
1 голос
/ 24 марта 2012

В MS-DOS COM-программы загружались со смещением 0x100. Я предполагаю, что Open Watcom делает такое предположение. Я бы предложил загрузить программу COM в 0x2010: 0x0100 и посмотреть, что это делает.

...