【问题标题】:Can CALLF (Far Call) has a 64 bit address memory operand in Intel 64 architecture?CALLF(Far Call)可以在 Intel 64 架构中有 64 位地址内存操作数吗?
【发布时间】:2019-02-09 20:16:10
【问题描述】:

在 Intel 32 位架构中,我可以使用 ModR/M 字节调用具有 32 位地址位置的调用。根据 Intel 手册,我需要 /2 (010B) 用于操作码扩展,00B 用于 Mod,101B 允许我进行 32 位位移。

如果我想在 64 位架构中进行远调用,以便为 64 位地址留出空间,我知道我可以 /3 (011B) 进行操作码扩展。但是,仍然只提供 32 位位移。有没有办法将目标指定为 64 位地址?

主要是,我想知道如何在给定位置的 64 位地址的情况下进行呼叫。

【问题讨论】:

  • 阅读英特尔手册:felixcloutier.com/x86/CALL.htmlcall far m16:64。顺便说一句,远调用的目标是 seg:offset,所以它是 80 (64+16) 或 48 (32+16) 位,而不是 64。
  • 感谢您的链接。我不明白如何使用段选择器。你会帮我更多吗?你能给我除了地址部分的操作码吗?喜欢你能给我一个关于如何组装 seg、offset 和 opcode 的参考吗?

标签: assembly 64-bit x86-64 intel


【解决方案1】:

您是在问call far [64_bit_absolute] 是否可编码?要从 64 位绝对地址中获取 m16:64 80 位操作数?

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

只有mov al/ax/eax/rax, [abs64] 可以用64 位绝对地址编码,使用不使用ModRM 字节的特殊形式的moffs 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 调用目标与其存储的位置混淆?在 64 位模式下,call ptr16:64(直接远调用)不可用,因此您始终需要内存中的 seg:off 以供 call 获取。但它可以在堆栈或其他任何东西上,例如

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]

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2018-11-10
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多