我一直在开发一个实模式的操作系统,使用汇编语言编写并使用NASM编译成平面的.bin可执行文件。
我希望能够使用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。 我以同样的方式调用 NASM 汇编并使用nasm -f bin test.asm -o test.com
进行编译。
当我测试操作系统时(使用Bochs),它成功加载了ctest.com,但是打印出了一个与msg[]无关的无意义字符。
有没有人对此有任何建议? 我认为字符串只是在错误的位置初始化。 我想保持这个操作系统为16位。
谢谢!