Я работаю над ОС реального режима, записывая в сборку и компилируя в плоские .bin исполняемые файлы с NASM.
Я хотел бы написать некоторые из ОСА в C, и поэтому написал программу эксперимента (ctest.c), который я хотел бы получить доступ к строке и вывести первый символ:
16-разрядная программа .com C в реальном режиме OS
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-битную ОС.
спасибо!
Первые 128 байт образа памяти .com содержат данные операционной системы, аналогичные CP/M. DOS зависит от этого. Следующие 128 байтов содержат командную строку. Исполнение начинается с 0x100. –