" mrs %0, ipsr " : "=r" (reg_tmp)
出于好奇,我需要翻译这段 ASM 代码,它是针对 ARMV7,特别是在特权模式下执行的 cortex-M7。我知道 MRS 指令是从特殊寄存器(此处的 IPSR 子寄存器/PSR 位字段)移动到通用寄存器。但我不明白这部分:“=r”(reg_tmp)不知何故。另外%0在这里意味着什么?
说实话,我对 ASM 代码知之甚少,所以请记住这一点。 :)
由此生成的 ASM 代码是:
push {r4}
mrs r3,ipsr
mov r4,r3
mov r3,r4
mov r0,r3
pop {r4}
bx r14
可以优化为:
push {r4}
mrs r0,ipsr
pop {r4}
bx r14
是的,你的手牌优化是正确的,但你可以通过省略推入和弹出来更进一步,因为它们相互抵消。
如果您用另一个名称
r14
(链接寄存器)来称呼 lr
,也会更容易阅读。如果您使用 GNU objdump 生成代码,请尝试添加 -M reg-names-std
以自动获取此代码。