我正在使用为 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 对输入/输出操作数使用相同的寄存器?

最佳答案

好的,我终于找到了 here



"=r" (res) 更改为 "=&r" (res) 后一切正常。

关于gcc - 如何强制 gcc 在 asm 中使用两个不同的寄存器来操作数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12745217/

10-11 19:10