我正在写我的第一个汇编语言程序,但我似乎找不到任何关于我遇到的错误的好信息。我的代码发布在下面。提前感谢您的帮助!
.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发布于 2019-11-20 00:15:06
感谢@Jester,我调整了我的ADDS行,并将它分成两行,这样每次我使用ADDS时,我就可以给出3个操作数。谢谢!
发布于 2019-11-20 05:05:11
它需要移位,因为带三个逗号的adds的唯一有效语法是第二个源操作数的移位计数。http://www.davespace.co.uk/arm/introduction-to-arm/barrel-shifter.html
包括adds在内的大多数ARM指令接受2个输入和写入1个输出。Asm必须将1:1映射到机器码,所以您不能添加额外的操作数。第二个输入可以选择移位,但不能有第三个加数。
int foo(int a, int b, int shift) {
return a + (b<<shift);
}compiles to this asm (用于ARM模式),带GCC9.2 -O3
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(如果这是缩略模式,则adds比add更紧凑。)
加法/加法支持立即操作数,但当然不支持两个立即操作数。这是没有用的,只是在汇编时使用mov r0, #5+6+7来做数学运算,并将其用作MOV指令不加法的立即数。
https://stackoverflow.com/questions/58938254
复制相似问题