首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编语言新手,出现错误:"add.s:7: error: shift expression expected -` `adds R0,R1,R2,R3'“

汇编语言新手,出现错误:"add.s:7: error: shift expression expected -` `adds R0,R1,R2,R3'“
EN

Stack Overflow用户
提问于 2019-11-20 00:03:54
回答 2查看 1.8K关注 0票数 1

我正在写我的第一个汇编语言程序,但我似乎找不到任何关于我遇到的错误的好信息。我的代码发布在下面。提前感谢您的帮助!

代码语言:javascript
复制
.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
EN

回答 2

Stack Overflow用户

发布于 2019-11-20 00:15:06

感谢@Jester,我调整了我的ADDS行,并将它分成两行,这样每次我使用ADDS时,我就可以给出3个操作数。谢谢!

票数 2
EN

Stack Overflow用户

发布于 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映射到机器码,所以您不能添加额外的操作数。第二个输入可以选择移位,但不能有第三个加数。

代码语言:javascript
复制
int foo(int a, int b, int shift) {
    return a + (b<<shift);
}

compiles to this asm (用于ARM模式),带GCC9.2 -O3

代码语言:javascript
复制
foo:
        add     r0, r0, r1, lsl r2
        bx      lr

要将三个数字相加,您需要两个add指令,用于两个+操作。(除非相同的数字出现两次,在这种情况下,您可以使用左移输入操作数,如add r0, r0, r1, lsl #1来执行r0 + r1 + r1 = r0 + r1*2)

你想要这样的东西:

代码语言:javascript
复制
        add     r0, r1, r2
        adds    r0, r0, #7

(如果这是缩略模式,则addsadd更紧凑。)

加法/加法支持立即操作数,但当然不支持两个立即操作数。这是没有用的,只是在汇编时使用mov r0, #5+6+7来做数学运算,并将其用作MOV指令不加法的立即数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58938254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档