[英]New to assembly language and having the error: “add.s:7: Error: shift expression expected — `adds R0,R1,R2,R3'”
我正在編寫我的第一個匯編語言程序,但我似乎找不到任何關於我遇到的錯誤的好信息。 我的代碼發布在下面。 在此先感謝您的幫助!
.global _start
_start
MOV R1, #5 @ Get 5 into R1
MOV R2, #6 @ Get 6 into R2
MOV R3, #7 @ Get 7 into R3
ADDS R0, R1, R2, R3 @ Add the three, result in R0
MOV R7, #1 @ exciters through sys call
SWI 0
感謝@Jester,我調整了我的 ADDS 行並將其分成 2 行,這樣我每次使用 ADDS 時都可以提供 3 個操作數。 謝謝!
它期待一個移位,因為用三個逗號adds
的唯一有效語法是第二個源操作數的移位計數。 http://www.davespace.co.uk/arm/introduction-to-arm/barrel-shifter.html
大多數 ARM 指令,包括adds
2 個輸入並寫入 1 個 output。 Asm 必須 map 1:1 與機器代碼,所以你不能添加額外的操作數。 第二個輸入可以有選擇地移位,但不能有第三個加數。
int foo(int a, int b, int shift) {
return a + (b<<shift);
}
使用 GCC9.2 -O3編譯為此 asm (對於 ARM 模式)
foo:
add r0, r0, r1, lsl r2
bx lr
要添加三個數字,您需要兩個add
指令,用於兩個+
操作。 (除非相同的數字出現兩次,在這種情況下,您可以使用左移輸入操作數,例如add r0, r0, r1, lsl #1
來執行r0 + r1 + r1 = r0 + r1*2
)
你想要這樣的東西:
add r0, r1, r2
adds r0, r0, #7
(如果這是 Thumb 模式, adds
比add
更緊湊。)
ADD/ADDS 支持立即操作數,但當然不支持兩個立即操作數。 那是沒用的,只需使用mov r0, #5+6+7
在匯編時進行數學運算,並將其用作 MOV 指令而不是 ADDS 的立即數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.