Assembly org 0C700h给出了奇怪的输出
我正在写一个引导程序,但我不确定我所做的是否正确。首先,我使用此批处理脚本编译我的引导加载程序:Assembly org 0C700h给出了奇怪的输出,assembly,linker,bootloader,Assembly,Linker,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位)。 现在,在我的
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位)。
现在,在我的程序集文件bootloaderam.asm中,如果我添加“org 07C00”,则输出文件bootloaderam.sys将在07C00之前填充0,然后填充预期的代码。但是,如果我删除它,输出文件将如预期的那样。
据我所知,org指令只是调整指令使用的地址,使基数为07C00,我想它不应该用零填充我的输出文件
编译器和汇编器中的.obj文件似乎没有问题。它们在0x07c00之前不包含前导零,但链接器的最终输出是错误的
现在是链接器的问题吗?如何修复/您是否建议使用其他(16位)链接器?另外-如果我只是忽略引导加载程序的org指令,可以吗
另外-我已经写了一个程序来读取我的引导加载程序并将其写入虚拟硬盘的引导扇区,我可以简单地修改它以忽略链接器输出中的前导零-这样行吗
多谢各位
据我所知,org指令只是调整
根据我的指示,底座是07C00,我想它不应该填满
我的输出文件是否为零
根据,的MASM实现实际上将后续输出移动到给定偏移量
根据您的观察,由于在该点之前可能有来自其他模块的代码,.OBJ文件仅存储偏移量,希望链接器通过简单的填充来正确定位偏移量
现在是链接器的问题吗?我怎样修理它/你有什么建议吗
不同的(16位)链接器
链接器在这里没有错。这是一种怪癖的行为
另外,如果我只是忽略我的组织指令,可以吗
引导程序
另外,我已经编写了一个程序来读取我的引导加载程序并将其写入
虚拟硬盘的引导扇区,我只需将其修改为
忽略链接器输出中的前导零-这样行吗
通过阅读OSDev Wiki,这两种方法都可以很好地工作,只要段寄存器得到相应的处理。我的理解是,输出应该放在硬盘分区的0
位置,并加载到offset0x7c00
中。只要它按照这个规范运行,它“应该工作”
以下内容可能提供进一步的有用阅读:
相关帖子中的MASMSEGMENT
(msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx)指令(stackoverflow.com/questions/12552072/MASM-SEGMENT-directive)
PS.(我“需要至少10个声誉”,考虑到这是我的第一篇帖子,“发布超过2个链接”。我没有使用Digital Mars的链接器,但也许
/BASE
和/FIXED
开关可以实现你想要的(与ORG 0
相结合)。谢谢你的回复。因此,我不确定/FIXED选项有何帮助,但如果我使用/BASE:31744(07C00为十进制),那么在引导加载程序中使用org 0可以吗?基址应该是十六进制的,而不是十进制的。它能不能用,我不知道,因为我还没用过。我只是建议你试试。