繁体   English   中英

不能强制在GCC内联汇编中使用64位寄存器

[英]Can't force the use of 64-bit registers in GCC inline assembly

我试图用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位寄存器?

这实际上将RAX寄存器设置为60:

mov eax, 60

写入EAX始终会清除64位寄存器的高32位半部分 这与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位立即移动的方式组装。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM