ARM中mov等指令如何写MOVS

How to write MOVS in terms of mov and other commands in ARM

我正在做一个项目,我尝试不使用 MOVS 命令而是结合使用 MOV 和其他命令。

        mov     r3, #-2147483648
        str     r3, [r7, #36]
        mvn     r3, #-2147483648
        str     r3, [r7, #32]
        movs    r3, #0
        str     r3, [r7, #28]
        movs    r3, #0
        str     r3, [r7, #24]

正如您所见,这里使用了两次 movs,它的等价物是什么?可能使用 ldr 和 mov?谢谢!

tst reg,reg 根据值设置标志,因此 mov dst,src + tst dst,dst 将是任何情况下的天真 drop-in 替代。

或者在您的情况下,您的 str 指令不依赖于标志,因此您可以只使用 mov r3, #0。 (一次;使用 str 读取它不会破坏该值,因此无需再次设置)。

但是,如果您确实还想根据 0 值设置标志,则可以使用 ands r3, #0 低效地清零寄存器。 (在 ARM 模式下无法使用 orrs r3, #-1 低效地设置 all-ones;立即数不可编码。但它处于 Thumb 模式且 Thumb-2 可用。)

(或 eors r3,r3subs r3,r3 借用 ,但请注意 ARM CPU 不会特例,并且 运行 它有效。事实上他们'不允许这样做:memory-ordering 模型有 data-dependency 排序,就像 C++11 std::memory_order_consume 应该暴露的那样,但在其他方面是弱排序的。eorssubs,像所有 ALU 指令一样,无论任何特殊情况如何,都保证对其输入具有数据依赖性。)


对于复制寄存器,adds reg, reg, #0 应该可以解决问题。这显然是一个单独的指令,即使在 Thumb 模式下也有单独的操作码。

.syntax unified
.thumb_func
adds r1, r2, #0
movs r1, r2

arm-none-eabi-gcc -mcpu=cortex-a53 -c arm.s && arm-none-eabi-objdump -d arm.o

   0:   1c11            adds    r1, r2, #0
   2:   0011            movs    r1, r2

Arm dedicated comparisons

Comparison Arithmetic
cmp subs
cmn adds
tst ands
teq eors

也就是说,这四个指令执行等价的算术运算,但不将结果写入目的地。唯一的作用是设置条件代码,就好像使用了算术指令一样。

为了正确移植它,最好解决原始 movsintent 是什么。很有可能不需要条件代码,这是代码最初针对的体系结构的限制。