Я работал над операционной системой реального режима, писал на ассемблере и компилировал в плоские .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-битную ОС.
спасибо!