Assembly 如何使用64位呼叫门
在“英特尔软件开发人员maunal”中,调用指令支持:Assembly 如何使用64位呼叫门,assembly,x86-64,Assembly,X86 64,在“英特尔软件开发人员maunal”中,调用指令支持: call r/m64 call m16:32 call m16:64 在用户代码中,如果我想通过带有选择器47的64位调用门传输到环0。 如何使用英特尔语法在汇编中编写指令 测试: call far [mem]; wrong call qword ptr [mem]; wrong 内存内容: [mem + 0]: qword 0x00 [mem + 8]: word 47 要使用的正确关键字是fword ptr。这将生成m16:32变
call r/m64
call m16:32
call m16:64
在用户代码中,如果我想通过带有选择器47的64位调用门传输到环0。
如何使用英特尔语法在汇编中编写指令
测试:
call far [mem]; wrong
call qword ptr [mem]; wrong
内存内容:
[mem + 0]: qword 0x00
[mem + 8]: word 47
要使用的正确关键字是
fword ptr
。这将生成m16:32
变量,但由于对于调用门,偏移量被忽略,并且将从门加载完整的RIP
64位,因此这将很好。但是,如果要保留m16:64
指针,则必须手动包含REX
前缀,如rex64 call fword ptr[mem]
或REX.w call fword ptr[mem]
这是一个很长的目标,但是tword ptr
用于处理十字节结构(基本上是80位长的双字节结构)。还有一些汇编器使用lcall
进行长调用。我认为只有中断和系统调用可以转移到零环?毕竟,如果简单的调用可以改变它,它就不是真正的安全功能。不,调用门是从环x(x>0)进入环0的一个选项。顺便问一下,“调用远[mem]”的含义是什么,我发现它不等于“调用fword ptr[mem]”。从生成的机器代码判断,在本例中,far
似乎被默默忽略,并生成一个near调用。