我正在做一個專案,我試圖不使用 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?謝謝!
uj5u.com熱心網友回復:
tst reg,reg根據值設定標志,因此mov dst,src tst dst,dst在任何情況下都是天真的替代品。
或者在您的情況下,您的str指令不依賴于標志,因此您可以使用mov r3, #0. (一次;讀取它str不會破壞該值,因此無需再次設定它)。
但是如果你真的想根據0值設定標志,你可以用ands r3, #0. (在 ARM 模式下無法有效地設定為全一orrs r3, #-1;立即數不可編碼。但在 Thumb-2 可用的 Thumb 模式下。)
(或者eors r3,r3借用subs r3,r3x86 zeroing idiom,但請注意 ARM CPU 不會對此進行特殊處理并有效地運行它。事實上,它們是不允許這樣做的:記憶體排序模型具有像 C 一樣的資料依賴排序 11std::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
Arm專用比較
| 比較 | 算術 |
|---|---|
| CMP | 潛艇 |
| 厘米 | 添加 |
| 時間 | 和 |
| teq | 厄運 |
即,這四個指令執行等價的算術運算,但不將結果寫入目標。唯一的效果是設定條件代碼,就好像使用了算術指令一樣。
為了正確移植它,最好解決原始的意圖movs是什么。很可能不需要條件代碼,這是代碼最初針對的體系結構的限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443215.html
