我正在写一个bootloader,但我不确定我所做的是否正确。首先,我使用这个批处理脚本来编译我的引导加载程序:
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,然后填写预期的代码。但是,如果我删除它,输出文件是预期。 据我所知,组织指令只是调整我的指令使用的地址,使基数为07C00,我想它不应该用零填充我的输出文件?
编译器和汇编程序中的.obj文件似乎没问题。它们在0x07c00之前不包含前导零,但链接器的最终输出是错误的。
链接器的问题是什么?我怎么能修复它/你建议一个不同的(16位)链接器?另外 - 如果我只是忽略我的引导加载程序的组织指令,它可以吗?
另外 - 我编写了一个程序来读取我的引导程序并将其写入虚拟硬盘的引导扇区,我可以简单地修改它以忽略链接器输出中的前导零 - 这会起作用吗?
谢谢。
答案 0 :(得分:0)
据我所知,组织指令只是调整使用的地址 我的指示,以便基数是07C00,我想它不应该填补 用零输出我的输出文件?
根据NASM Manual,ORG
的MASM实现实际上将后续输出移动到给定的偏移量。
至于你的观察,由于在该点之前可能存在来自其他模块的代码,因此.OBJ文件仅存储偏移量,期望链接器正确定位它,在这种情况下通过简单的填充。
链接器的问题是什么?我怎么能解决它/你建议一个 不同的(16位)链接器?
此处链接器没有错。这是MASN表演的怪癖。
另外 - 如果我简单地忽略了我的组织指令,那就没关系了 引导加载程序?
另外 - 我编写了一个程序来读取我的引导程序并将其写入 虚拟硬盘的启动扇区,我可以简单地修改它 忽略链接器输出中的前导零 - 这会起作用吗?
通过阅读OSDev Wiki,两者都可以正常工作,前提是相应地处理段寄存器。我的理解是输出应该放在硬盘分区中的0
位置并加载到偏移0x7c00
中。只要它按照这个规范运行,它就“应该工作”。
以下内容可能会提供更有帮助的阅读材料:
相关帖子中的MASM SEGMENT
(msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx)指令(stackoverflow.com/questions/12552072/masm- segment-directive)
PS。 (我“需要至少10个声望”,我没有考虑这是我的第一篇文章,“发布超过2个链接”。)