我如何知道MASM是否使用相对或绝对偏移量编码我的JMP指令?

时间:2016-07-18 10:39:54

标签: windows assembly windows-10 masm

  

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

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

我想确定我的跳转是相对的,但我找不到任何正确的MASM文档,告诉我JMP @label是否实际转换为相对跳转。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

没有近似 - 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的风险