[英]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.