我有以下說明:mov r1, r7在我的匯編代碼中,但在查看反匯編后,我發現實際生成的代碼是adds r1, r7, #0
我查看了 ARMv6-M 架構參考手冊,發現有MOVS <Rd>,<Rm>指令(A6.7.40)與ADDS.
雖然這不是一個大問題,但我仍然很困惑為什么匯編程式會替換我用不同的操作碼撰寫的代碼。根據我正在閱讀的書,所有非跳轉指令都需要 1 個周期(我更喜歡匯編程式是愚蠢的,而不是試圖為我優化某些東西)。
我正在使用使用 GNU Assembler、AFAIK 的 Raspberry Pi Pico SDK。
我所有的代碼都是用 helloworld.S 撰寫的,完整的源代碼是:
.thumb_func
.global main
main:
mov r7, #0
bl stdio_init_all
loop:
ldr r0, =helloworld
add r7, #1
mov r1, r7
bl printf
mov r0, #250
bl sleep_ms
b loop
.data
.align 4
helloworld: .asciz "Hello World %d\n"
uj5u.com熱心網友回復:
您正在撰寫 Thumb 模式匯編代碼,并且 RPi Pico 支持 Thumb-2,這意味著實際輸出將為UAL 格式。
如果您參考ARMv6-M 參考手冊,表 D4-1 指定了將 pre-UAL Thumb 語法轉換為 UAL 語法,特別是:
| Pre-UAL Thumb 語法 | 等效 UAL 語法 | 筆記 |
|---|---|---|
MOV <Rd>, <Rm> |
ADDS <Rd>, <Rm>, #0 |
如果<Rd>和<Rm>都是 R0-R7。 |
MOV <Rd>, <Rm> |
否則。 |
正如 Tom 建議的那樣,.syntax unified如果您想撰寫 UAL 代碼(然后將按原樣實際組裝),您可以添加。
uj5u.com熱心網友回復:
我可以建議您添加:
.syntax unified
在檔案的開頭?之后,您必須在所有指令中顯式添加后綴,以標記它們是否設定標志以及它們是否是有條件的,但您可能會發現顯式控制所使用的操作碼更容易。
這是您在編譯器資源管理器中的代碼: https ://godbolt.org/z/zo8nnc9sh
uj5u.com熱心網友回復:
Thumb 指令是 16 位長,不是很多位。由于mov rx, ry和adds rx, ry, #0做同樣的事情并且adds rx, ry, #0更通用,所以只支持adds版本并且mov被匯編器轉換為“*adds”。所以mov本質上變成了一個偽指令。
其他 ISA 也做類似的事情。RISC-V在 RV32I ISA中沒有mv指令。它被類似地編碼為addi。關鍵是節省操作碼編碼空間,這是一種有限的資源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443217.html
