On 2017/11/3 11:11, stephen lu wrote:
I read article about GCC Inline Assembler
(http://www.ethernut.de/en/documents/arm-inline-asm.html).
(... abridged ...)
But I disassemble code by objdump -d . "memory" Clobber don't works,
the code is to do execute both inline assembler instructions, and then
do the multiplication.
mrs ip, CPSR
orr ip, ip, #192 ; 0xc0
msr CPSR_c, ip
mrs ip, CPSR
bic ip, ip, #192 ; 0xc0
msr CPSR_c, ip
mul r0, r1, r0
mov pc, lr
Can anyone help me?
(... abridged ...)
Does your variable `c` have file scope?
If it has block scope and is not passed to the asm statement as an
output or input-output parameter directly or indirectly, the compiler
will assume that it is not altered by the asm statement hence can be
reordered.
The problem can be resolved by adding dummy constraints that will
prohibit rearrangement of these statements:
<https://godbolt.org/g/Ap3mmc>
```c
int foo(int c, int b){
// Note the two `"+r"(c)` in-out constraints.
asm volatile("mrs r12, cpsr\n\t"
"orr r12, r12, #0xC0\n\t"
"msr cpsr_c, r12\n\t" :"+r"(c):: "r12", "cc");
c *= b;
asm volatile("mrs r12, cpsr\n"
"bic r12, r12, #0xC0\n"
"msr cpsr_c, r12" :"+r"(c):: "r12", "cc");
return c;
}
```
--
Best regards,
LH_Mouse