簡體   English   中英

我可以在gcc內聯匯編中修改輸入操作數嗎

[英]Can I modify input operands in gcc inline assembly

我們知道,如果我將%eax設置為輸入,則無法將其包含在受破壞的寄存器列表中。 所以我的問題是,在匯編列表中不聲明任何內容而修改匯編代碼中%eax的值是否合法?

__asm__ __volatile__("inc %0" :: "a"(num) : "%eax"); // illegal
__asm__ __volatile__("inc %0" :: "a"(num));       // Can I modify %eax?

否,如果匯編代碼更改了輸入寄存器,則還必須通過在約束中使用“ +”而不是“ =”將其列為輸出寄存器或輸入輸出寄存器。

例子:

__asm__ __volatile__("..." : "+r"(num));
__asm__ __volatile__("..." : "=a"(dummy) : "a"(num));
__asm__ __volatile__("..." : "=r"(dummy) : "0"(num));

第一個示例將num指定為輸入和輸出。 這將覆蓋num的先前值,如果操作數被破壞而被設置為有用的值,則這可能是不希望的。

第二個示例將eax明確用於輸入和輸出。 它將輸出定向到dummy變量,以免破壞實際的輸入變量num

第三個示例使用偽輸出,以避免修改num ,還避免顯式指定eax,從而允許編譯器選擇要使用的寄存器。 "0"約束條件告訴編譯器對此輸入操作數使用與操作數0相同的寄存器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM