【发布时间】:2012-03-24 19:48:35
【问题描述】:
我一直在研究实模式操作系统,用汇编编写并使用 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(;;);
}
我使用 wcl ctest.c -lr -l=COM 使用 Open Watcom v1.9 编译了这个。这将创建 ctest.com。我在 NASM 汇编中编写的内核将这个程序加载到 0x2010:0x0000,将 DS 和 ES 设置为 0x2000:0x0000,然后跳转到 0x2010:0x0000。这就是我一直在调用用汇编编写并使用nasm -f bin test.asm -o test.com 编译的.COM 程序的方式。
当我测试操作系统(使用 Bochs)时,它成功加载了 ctest.com,但打印出一个不属于 msg[] 的无意义字符。
有人对此有什么建议吗?我认为字符串只是在错误的地方初始化。我想将其保留为 16 位操作系统。
谢谢!
【问题讨论】:
-
.com 内存映像的前 128 个字节包含操作系统数据,类似于 CP/M。 DOS 依赖于它。接下来的 128 个字节包含命令行。执行从 0x100 开始。
标签: c assembly x86 bootloader watcom