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,r3
或 subs r3,r3
借用 ,但请注意 ARM CPU 不会特例,并且 运行 它有效。事实上他们'不允许这样做:memory-ordering 模型有 data-dependency 排序,就像 C++11 std::memory_order_consume
应该暴露的那样,但在其他方面是弱排序的。eors
和 subs
,像所有 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
Comparison
Arithmetic
cmp
subs
cmn
adds
tst
ands
teq
eors
也就是说,这四个指令执行等价的算术运算,但不将结果写入目的地。唯一的作用是设置条件代码,就好像使用了算术指令一样。
为了正确移植它,最好解决原始 movs
的 intent 是什么。很有可能不需要条件代码,这是代码最初针对的体系结构的限制。
我正在做一个项目,我尝试不使用 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,r3
或 subs r3,r3
借用 std::memory_order_consume
应该暴露的那样,但在其他方面是弱排序的。eors
和 subs
,像所有 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
Comparison | Arithmetic |
---|---|
cmp | subs |
cmn | adds |
tst | ands |
teq | eors |
也就是说,这四个指令执行等价的算术运算,但不将结果写入目的地。唯一的作用是设置条件代码,就好像使用了算术指令一样。
为了正确移植它,最好解决原始 movs
的 intent 是什么。很有可能不需要条件代码,这是代码最初针对的体系结构的限制。