我正在使用为sam7s处理器编译的gcc 4.6.3。
我需要使用一些内联汇编:
int res;
asm volatile (" \
MRS r0,CPSR \n \
MOV %0, r0 \n \
BIC r0,r0,%1 \n \
MSR CPSR,r0 \n \
" : "=r" (res) : "r" (0xc0) : "r0" );
return res;
由gcc翻译为(由我添加的评论):
mov r3, #192 ; load 0xc0 to r3
str r0, [sl, #56] ; preserve value of r0?
mrs r0, CPSR ; load CPSR to r0
mov r3, r0 ; save r0 to "res"; r3 overwritten!
bic r0, r0, r3 ;
msr CPSR_fc, r0 ;
问题在于,使用相同的寄存器“r3”代替“%0”(res)和“%1”(常量:0xc0)。因此,%1在使用之前会被覆盖,并且代码工作不正确。
问题是如何禁止gcc对输入/输出操作数使用相同的寄存器?
答案 0 :(得分:5)
好的,最后我发现它here
&安培;表示在输入为
之前写入输出操作数 读取,所以此输出不能与任何输入相同 如果没有这个,gcc可以在其中放置输出和输入 即使不是“0”约束也需要注册。这是非常的 有用,但这里提到是因为它特定于 替代。与=和%不同,但是喜欢?,你必须包括它 与其适用的每种替代方案。
将"=r" (res)
更改为"=&r" (res)
后,一切正常。