簡體   English   中英

匯編語言新手並出現錯誤:“add.s:7: Error: shift expression expected — `adds R0,R1,R2,R3'”

[英]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 模式, addsadd更緊湊。)

ADD/ADDS 支持立即操作數,但當然不支持兩個立即操作數。 那是沒用的,只需使用mov r0, #5+6+7在匯編時進行數學運算,並將其用作 MOV 指令而不是 ADDS 的立即數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM