我正在尝试用GCC Inline Assembly做一些事情,在这种情况下,做一个Syscall,但我想强制使用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位寄存器?
答案 0 :(得分:9)
这实际上将RAX寄存器设置为60:
mov eax, 60
Writing to EAX always clears the upper 32-bit half of the 64-bit register。这与AH和AL不同,写操作会保留寄存器的其余部分。
如果你绝对想要转移到RAX,你需要使用这样的东西:
static inline __attribute__ ((always_inline)) void
syscall(uint64_t arg1, uint64_t arg2)
{
__asm__("mov rax, %0; syscall" : : "i" (arg1), "D" (arg2) : "rax");
}
请注意,gas
仍会将其组合为32位立即移动。