內聯彙編中的輸出寄存器必須用「=」約束聲明,意思是「只寫」[1]。這意味着什麼 - 它是否真的被禁止在大會內部讀取和修改它們?例如,請考慮以下代碼:在avr-gcc內聯彙編中使用輸出寄存器有哪些限制?
uint8_t one()
{
uint8_t res;
asm("ldi %[res],0\n"
"inc %[res]\n"
: [res] "=r" (res)
);
return res;
}
程序集將輸出寄存器設置爲0,然後遞增它。這是否打破了「只寫」約束?
UPDATE
我看到在我的內聯彙編休息時,我把它改爲直接在輸出寄存器的工作,而不是使用R16的計算,最後mov'ing R16到輸出問題寄存器。代碼在這裏:http://ideone.com/JTpYma。它將結果打印到串行,你只需要定義F_CPU和BAUD。只有使用gcc-4.8.0而不使用gcc-4.7.2時纔會出現該問題。
[1] http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
你可能是錯在這裏,看到我的編輯。或者它只是一個編譯器錯誤。 –
編輯答案也是。 – Jester
確實修復了它,謝謝! –