【发布时间】:2013-03-04 10:57:54
【问题描述】:
我正在编写一个引导加载程序,但我不确定我所做的是否正确。首先,我使用这个批处理脚本来编译我的引导加载程序:
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 指令可以吗?
另外 - 我已经编写了一个程序来读取我的引导加载程序并将其写入虚拟硬盘驱动器的引导扇区,我可以简单地修改它以忽略链接器输出中的前导零 - 可以吗?
谢谢。
【问题讨论】:
-
我没有使用 Digital Mars 的链接器,但也许
/BASE和/FIXED开关可以完成你想要的(结合ORG 0)。 -
感谢您的回复。所以我不确定 /FIXED 选项有什么帮助,但如果我使用 /BASE:31744(十进制的 07C00),是否可以在引导加载程序中使用 org 0?
-
基地址应该以十六进制给出,而不是十进制。能不能用,因为没用过,不知道。我只是建议您可以尝试一下。
标签: assembly linker bootloader