汇编 – 如何在x86中编码相对较短的jmp

假设我想使用以下操作码进行短暂跳转:

EB CB or JMP rel8

“Jump short, RIP = RIP + 8-bit displacement sign
extended to 64-bits”

(where CB is a byte signed value representing the relative offset relating to direction in EIP register)

也许总是偏移将被偏移2因为执行时间(参考方向)在这个短暂跳跃的EIP是二位指令的基础,但加数occurs always

eb 30 = jmp 0x00000032 (+30)

eb e2 = jmp 0xffffffe4 (-30)

then EIP can be intentionally the same direction because fe + 2 is 00 or EIP.

eb fe = jmp 0x00000000

我发现令人惊讶的是,尽管数字是负数,但是这种超额分配已经分歧了.但是在英特尔我没有提到(也许是因为3000页).

Intel® 64 and IA-32 Architectures
Software Developer’s Manual: Vol. 2A 3-423

A near jump where the jump range is limited to –128 to +127 from the current EIP value.

然后我考虑三种可能性:

>是2,因为EIP在执行时间中的后/未来值
>编码值不是2s分量编码的有符号数.
>这显示在手册中,但我没有看到,因为我很愚蠢

rel8相对于下一条指令的存储器地址,可以通过创建两个可执行文件并拆卸它们来轻松确认:

@label:
    jmp @label
    nop

这个拆分为(在16位,32位和64位代码中是相同的)

EBFE jmp short 0x0
90   nop

然后,另一个可执行文件:

jmp @label
@label:
    nop

EB00 jmp short 0x2
90   nop

所以,rel8总是相对于jmp之后的下一条指令进行编码.然而,反汇编(至少是disnd和udcli)显示它相对于jmp指令本身.这可能会引起一些混乱.

相关文章
相关标签/搜索