我正在编写我的第一个汇编语言程序,似乎找不到任何关于我所遇到的错误的好信息。我的代码发布在下面。提前感谢您的帮助!
.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模式,则adds
比add
更紧凑。(
ADD/ADS支持一个立即数操作数,但当然不支持两个立即数。这将是无用的,只需在汇编时使用mov r0, #5+6+7
进行计算,并将其用作MOV指令的立即数,而不是ADDS。