0

我正在编写一个引导加载程序,但我不确定我所做的是否正确。首先,我使用这个批处理脚本来编译我的引导加载程序:

dm\bin\dmc.exe -msdo -c -cpp bootloader.cpp
masm\bin\ml.exe -c bootloaderASM.asm
dm\bin\link.exe /BINARY bootloaderASM.obj bootloader.obj

我正在使用 DMC 的编译器和链接器,以及 masm 615 汇编器,它们都应该是 16 位(DMC 是 16 和 32)。现在在我的程序集文件 bootloaderASM.asm 中,如果我添加“org 07C00”,输出文件 bootloaderASM.sys 将填充 0 直到 07C00,然后填充预期的代码。但是,如果我删除它,输出文件为预期的。据我了解, org 指令只是调整我的指令使用的地址,以便基数为 07C00,我想它不应该用零填充我的输出文件?

编译器和汇编器中的 .obj 文件似乎没问题。它们在 0x07c00 之前不包含前导零,但链接器的最终输出是错误的。

现在是链接器的问题吗?我该如何修复它/您是否建议使用不同的(16 位)链接器?另外-如果我只是忽略引导加载程序的 org 指令可以吗?

另外 - 我已经编写了一个程序来读取我的引导加载程序并将其写入虚拟硬盘驱动器的引导扇区,我可以简单地修改它以忽略链接器输出中的前导零 - 这行得通吗?

谢谢你。

4

1 回答 1

0

据我了解, org 指令只是调整我的指令使用的地址,以便基数为 07C00,我想它不应该用零填充我的输出文件?

根据NASM Manual,MASM 的实现ORG实际上将后续输出移动到给定的偏移量。

至于您的观察,由于在那之前可能有来自其他模块的代码,.OBJ 文件仅存储偏移量,期望链接器正确定位它,在这种情况下通过简单的填充。

现在是链接器的问题吗?我该如何修复它/您是否建议使用不同的(16 位)链接器?

链接器在这里没有错。这是 MASN 的一个怪癖。

另外-如果我只是忽略引导加载程序的 org 指令可以吗?

另外 - 我已经编写了一个程序来读取我的引导加载程序并将其写入虚拟硬盘驱动器的引导扇区,我可以简单地修改它以忽略链接器输出中的前导零 - 这行得通吗?

通过阅读 OSDev Wiki,只要相应地处理段寄存器,两者都可以正常工作。我的理解是输出应该放在0硬盘分区中的位置并加载到 offset0x7c00中。只要它按照这个规范运行,它“应该可以工作”。

以下内容可能会提供进一步的帮助阅读:

相关帖子 (stackoverflow.com/questions/12552072/masm-segment-directive) 中的MASM SEGMENT(msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx) 指令

PS。(我“需要至少 10 个声誉”,考虑到这是我的第一篇文章,“发布超过 2 个链接”,我没有。)

于 2013-03-04T13:12:45.790 回答