Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用64位呼叫门_Assembly_X86 64 - Fatal编程技术网

Assembly 如何使用64位呼叫门

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变

在“英特尔软件开发人员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
变量,但由于对于调用门,偏移量被忽略,并且将从门加载完整的
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调用。