簡體   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