【问题标题】:How to jump by using x64 memory address, stored at x64 location?如何使用存储在 x64 位置的 x64 内存地址跳转?
【发布时间】:2015-01-04 17:42:51
【问题描述】:

据我所知,使用 64 位地址作为操作数的“jmp”是不可能的,但我相信使用 x64 内存位置是(来自here JMP r/m64)。但是我怎么能用十六进制写呢?

说明我想要什么指令的十六进制操作码:

qword memAddress

jmp far qword ptr [memAddress]

【问题讨论】:

  • 任何想法 - 操作码是 REX.W + FF /5 JMP m16:64
  • 您没有指定处理器类型,但我想我会指出 JMP m16:64 仅适用于 Intel x64 而不适用于 AMD 的 x64

标签: assembly x86 64-bit x86-64


【解决方案1】:
jmp far qword ptr [memAddress]

为了它的价值。我的汇编程序产生这个:48h,FFh,2Ch,25h,00h,00h,00h,00h

【讨论】:

    【解决方案2】:

    jmp far 不需要一个 qword 内存操作数,它需要一个 80 位 m16:64 操作数才能加载到 CS:RIP 中。

    我认为您想省略 far 并使用仅修改 RIP 而不是 CS 的间接近跳转。您说您想要 JMP r/m64,就是这样。

    在 NASM 语法中,qword 是间接跳转的默认操作数大小:

    default rel
    label:
        jmp [rel label]
    

    组装 + 反汇编 (objdump -drwC -MIntel) 到这个:

    ff 25 fa ff ff ff jmp QWORD PTR [rip+0xfffffffffffffffa] # 401000 <label>


    如果您的指针是汇编时常量,请参见Call an absolute pointer in x86 machine code,例如对于 JIT。 (例如mov rax, 0x123456789ab / jmp raxcall rax 也是一个选项。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 2018-09-17
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多