我一直在研究实模式操作系统,用 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。这就是我一直在调用用汇编编写并用 .COM 编译的 .COM 程序的方式nasm -f bin test.asm -o test.com
。
当我测试操作系统(使用 Bochs)时,它成功加载了 ctest.com,但打印出一个不属于 msg[] 的无意义字符。
有人对此有什么建议吗?我认为字符串只是在错误的地方初始化。我想将其保留为 16 位操作系统。
谢谢!