我正在尝试使用GCC内嵌汇编来做一些事情,比如进行系统调用,但是我想强制使用64位寄存器(rax、rdi、rsi等)而不是32位寄存器(eax、edi等),但是我尝试了很多方法,都没有成功。
void syscall(uint64_t arg1, uint64_t arg2) {
// arg1 -> rax arg2 -> rdi
__asm__("syscall" : : "a" (arg1), "D" (arg2));
}
当我编译时,我得到以下结果:
mov eax, 60
syscall
我在一个函数中,因此“edi”是从参数中获取的,但正如您所看到的是“eax”,我想使用rax。
如何强制使用64位寄存器而不是32位寄存器?
-O0
的优化级别进行编译。在优化级别为-O0
时,您可能会发现_RAX_被使用。当编译器打开优化时,它可能利用以下事实:当操作的目标是32位寄存器时,上32位变成0。我敢打赌,如果您进行一个实验,调用syscall(0x6060606060606060, 0x7fffffffffffffff);
,那么完整的寄存器_RAX_和_RDX_将被使用,因为这些值超过了32位可以表示的范围。 - Michael Petch