代码之家  ›  专栏  ›  技术社区  ›  masec

callf(far call)在英特尔64体系结构中能否有64位地址内存操作数?

  •  2
  • masec  · 技术社区  · 6 年前

    在Intel32位体系结构中,我可以使用modr/m字节调用32位地址位置。根据英特尔手册,操作码扩展需要/2(010B),mod需要00B,101B需要32位位移。

    如果我想在64位体系结构中有一个远调用,这样我就有了64位地址的空间,我知道我可以/3(011B)进行操作码扩展。但是,仍然只提供32位位移。有没有办法将目标指定为64位地址?

    主要是,我想知道我如何能有一个64位地址的位置打电话。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Peter Cordes    6 年前

    你是在问 call far [64_bit_absolute] 是可编的吗?去取 m16:64 来自64位绝对地址的80位操作数?

    不, call far [mem] 不是特别的,摩德姆只能 [disp32] [RIP+rel32] 或涉及寄存器的寻址模式。 Referencing the contents of a memory location. (x86 addressing modes)

    只有 mov al/ax/eax/rax, [abs64] 可使用64位绝对地址进行编码,使用特殊形式的 moffs 不使用modrm字节的mov。这对您来说是无用的:在寄存器中使用段或偏移量对您没有帮助。

    但你可以使用 mov r64, imm64 把地址放进登记簿。例如

    mov  rax, absolute_address      ; where seg:off are stored
    call far [rax]
    

    或者,如果静态地址是64位,但汇编程序+链接器知道它在 call 指令, call far [rel seg_and_offset] 可以使用RIP相对寻址模式。


    否则,可能是你把seg:off-call目标和它存储的位置混淆了?在64位模式下, call ptr16:64 (直拨远端电话)不可用,因此您总是需要在内存中关闭seg:off 呼叫 去取。但它可以在堆栈上或其他任何位置,例如

    push 0x23        ; new CS value ends up in the low 2 bytes of a qword
    push rax         ; new offset.  It goes at a lower address because x86 is little-endian
    call far [rsp]