【问题标题】:org 0C700h gives weird outputorg 0C700h 给出奇怪的输出
【发布时间】: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


【解决方案1】:

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

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

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

现在是链接器的问题吗?我该如何解决/你有什么建议吗? 不同的(16 位)链接器?

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

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

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

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

以下内容可能会提供更多有用的阅读:

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

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

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多