兩個問題:內聯彙編:澄清約束脩飾符
(1)如果我理解正確的ARM內聯彙編的「R」的約束說,指令操作數只能是一個核心寄存器,在默認情況下是一個只讀操作數。但是,我注意到,如果同一指令的輸出操作數的約束爲「= r」,編譯器可能會重新使用相同的寄存器。這似乎違反了「只讀」屬性。所以我的問題是:「只讀」引用寄存器還是引用它連接的C變量? (2)在約束「= &r」中是否存在「&」僅僅要求爲輸出操作數選擇的寄存器不能與輸入操作數寄存器中的一個相同?我的問題與下面用於計算整數冪函數的代碼有關:即,「&」約束脩飾符是否必要/合適?
asm (
" MOV %[power],1 \n\t"
"loop%=: \n\t"
" CBZ %[exp],done%= \n\t"
" LSRS %[exp],%[exp],1 \n\t"
" IT CS \n\t"
" MULCS %[power],%[power],%[base] \n\t"
" MUL %[base],%[base],%[base] \n\t"
" B loop%= \n\t"
"done%=: "
: [power] "+&r" (power)
[base] "+&r" (base)
[exp] "+&r" (exp)
:
: "cc"
) ;
謝謝! Dan
號, 「R」 並不意味着只讀的,它只是意味着 「通用寄存器」。您在輸入列表中指定的參數是隻讀的,無論您使用何種約束。 – Jester
查看[this](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands)瞭解關於輸入參數和[this]的詳細信息(https://gcc.gnu.org/onlinedocs/ gcc/Simple-Constraints.html#Simple-Constraints)來獲得簡單約束的細節(比如''r「')。您可能還想看看[這裏](https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html)中關於「ARM系列」特定的約束。 –