[英]Returning a 64-bit result from a 32-bit IMUL with inline assembly in GCC
[英]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.