在Intel 64体系结构中,CALLF(远呼叫)是否具有64位地址内存操作数? [英] Can CALLF (Far Call) has a 64 bit address memory operand in Intel 64 architecture?

查看:0
本文介绍了在Intel 64体系结构中,CALLF(远呼叫)是否具有64位地址内存操作数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Intel 32位体系结构中,我可以使用MODR/M字节使用32位地址位置进行调用。根据英特尔手册,操作码扩展需要/2(010B),MOD需要00B,101B允许32位位移。

如果我想在64位体系结构中进行远调用,以便有空间容纳64位地址,我知道我可以/3(011B)用于操作码扩展。然而,仍然只提供32位位移。是否可以将目标指定为64位地址?

我主要想知道如何在给定该位置的64位地址的情况下拨打电话。

推荐答案

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

否,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字节的特殊形式的moffsMOV。这对您毫无用处:将段或偏移量放在寄存器中对您没有帮助。

但您可以使用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来获取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]

这篇关于在Intel 64体系结构中,CALLF(远呼叫)是否具有64位地址内存操作数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆