私はリアルモードのOSに取り組んでおり、アセンブリで書き込み、NASMを使用してフラットな.bin実行可能ファイルにコンパイルしています。
OSの一部を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(;;);
}
を使用してOpenWatcomv1.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
。
OSを(Bochsを使用して)テストすると、ctest.comが正常に読み込まれますが、msg[]の一部ではない意味のない文字が出力されます。
誰かがこれについて何か提案がありますか?文字列が間違った場所で初期化されているだけだと思います。これを16ビットOSとして残しておきたいです。
ありがとう!