【问题标题】:How do I know whether MASM encodes my JMP instruction using a relative or absolute offset?我如何知道 MASM 是使用相对偏移还是绝对偏移对我的 JMP 指令进行编码?
【发布时间】:2016-07-18 10:39:53
【问题描述】:

我如何知道 MASM 是使用相对偏移还是绝对偏移对我的 JMP 指令进行编码?

我知道 x86 为相对偏移和绝对偏移提供 JMP 操作码。

我想确定我的跳跃是相对的,但是我找不到任何合适的 MASM 文档来告诉我 JMP @label 是否真的转化为相对跳跃。

如果可能,请在答案中提供文档链接。


对于相反的问题: 如果您试图让 MASM 发出直接绝对远距离jmp

,请参阅How to code a far absolute JMP/CALL instruction in MASM?

【问题讨论】:

  • 反汇编目标文件? (也许一些 MASM 大师会提供更简单的方法来指定 jmp 应该是相对的,或者通过在源代码中标记它,或者通过将编译设置为 PIC(与位置无关的代码),但最后的反汇编总是在这里)。
  • 是的,但我希望有一些严格的文档。
  • JMP label 总是相对的,除非它是一个很大的跳跃并且你知道;)
  • @Jester:我可以想象一个汇编程序有一个“巨大的代码模型”选项,该选项将跳转到来自文字池的内存间接跳转。当然,据我所知,没有现有的汇编器实现这个虚构的功能,所以我同意这里没有什么可担心的。

标签: windows assembly windows-10 masm


【解决方案1】:

唯一的machine encodings for direct near jmps use relative displacements, not absolute。另请参阅 标签 wiki 以获取更多文档/手册链接,包括官方 MASM 手册。不过,我认为对于这个问题没有任何意义。


不存在立即进行绝对位移的 near-jmp,因此不存在汇编程序意外使用非 PIC 分支的风险。

绝对近跳转需要寄存器或内存操作数中的地址,因此 MASM 不能只将jmp target 组装成

section .rodata
pointer_to_target dq target          ; or dd for a 32bit pointer

section .text
jmp    [pointer_to_target]

因为那太荒谬了。 IDK,如果你能找到文件说明这种特定的精神错乱是绝对不可能的。

我能想象一个汇编器为你做这样的事情的唯一方法是,如果有某种“巨大的代码模型”,其中所有跳转目标都用 64 位指针而不是 32 位相对位移来引用。

但是 AFAIK,如果你想这样做,你必须在所有现有的汇编器中自己做。

文档已经够臃肿了,没有提到程序没有做的每一件奇怪的事情,所以我不希望找到任何具体的内容。这可能是那些被认为是显而易见且不言而喻的事情之一。 (或者语法与英特尔在其说明参考手册中使用的相匹配。)


正如 Jester 所说,您不会在不请求的情况下获得 far 跳转,因此任何汇编程序都不会有使用 JMP ptr16:32 编码 (EA imm16(segment) imm32(offset)) 进行正常 jmp 的风险。

【讨论】:

  • 谢谢!你有一个很好的参考资料,我可以自己查找这些问题吗?
  • MASM 6.1 手册可以在here 找到,但似乎是重新发布。
  • @NicolasLykkeIversen:instruction set reference。有关更多链接,请参阅 x86 标签 wiki(例如,Felix Cloutier 转换为 HTML 的英特尔官方 PDF。
  • @MargaretBloom:我想我什至从未尝试在谷歌上搜索 MASM 手册。 Microsoft 的官方文档 (msdn.microsoft.com/en-us/library/afzk3475.aspx) 已上线,并且是第一个热门。 x86 标记 wiki 已更新(使用那个和旧的 PDF,以防任何人都感兴趣)。
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2023-03-17
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多