两个问题:内联汇编:澄清约束修饰符
(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系列”特定的约束。 –