汇编语言新手并出现错误:"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个输出。Asm必须与机器代码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/ADS支持一个立即数操作数,但当然不支持两个立即数。这将是无用的,只需在汇编时使用mov r0, #5+6+7进行计算,并将其用作MOV指令的立即数,而不是ADDS。

相关内容

最新更新