Assembly ARM组件乘法错误

Assembly ARM组件乘法错误,assembly,arm,multiplication,Assembly,Arm,Multiplication,我在尝试将两个数字相乘并将它们存储在ARM组件的内存位置时遇到问题。我在模拟手臂皮质M0+。当我把乘法注释掉时,一切似乎都很顺利。我不确定我是否需要使用MUL或MUL,但不管怎样,我都不明白为什么它不起作用。我要解决的方程是: A = 2 B = 4 C = 6 D = A+(C*B)-2 当我取消对乘法的注释时,得到的错误是错误:无法加载文件。调试器中止*错误是由顺序不正确的寄存器引起的。先添加位置,然后再添加用于乘法的寄存器更容易 代码: 这看起来很像一条次要的错误消息,即调试器无法加载不

我在尝试将两个数字相乘并将它们存储在ARM组件的内存位置时遇到问题。我在模拟手臂皮质M0+。当我把乘法注释掉时,一切似乎都很顺利。我不确定我是否需要使用MUL或MUL,但不管怎样,我都不明白为什么它不起作用。我要解决的方程是:

A = 2
B = 4
C = 6
D = A+(C*B)-2
当我取消对乘法的注释时,得到的错误是错误:无法加载文件。调试器中止*错误是由顺序不正确的寄存器引起的。先添加位置,然后再添加用于乘法的寄存器更容易

代码:


这看起来很像一条次要的错误消息,即调试器无法加载不存在的文件,因为汇编程序错误地创建了它。我猜您正在使用一个IDE——它应该在某个地方有某种构建日志,让您看到汇编程序本身要说什么。不管怎样,咨询都是值得的。我不知道这会怎么做你想要的,因为你马上就把乘法的结果和负载…1弄糟了。A+D*C-2不是一个你能解的方程,因为没有=号,也没有未知数。2.为什么不预先编译呢?如果一切都是常量,只需使用程序集定义的常量并写入LDR Rx,=A+D*C-2即可。@notlike是的,这是一条错误消息。我正在使用uVision,但我不知道如何获得有关错误的更多信息。我使用的是免费版本,这可能就是原因。这是一个在线课程,很难跟上,因为没有讨论。我一直在阅读文档,但不知道它到底是如何适合的,这让我有点困惑。@Bregald抱歉,我写错了D'应该等于A+C*B-2,我一直在避免B,因为它显示为蓝色,但我将尝试使用它,如果不能使用,我将切换回递增一个字母超过B'不,更多的是,您需要正确地获得源操作数和目标操作数。在这方面,MUL和variants是个怪人;在主题之外,我建议让代码更易于管理的一件事是只使用基指针加载r7一次,然后使用偏移量寻址来访问各个变量,例如str r0、[r7,4]来存储B。
    AREA |.text|, CODE, READONLY, ALIGN=2
    EXPORT __main

    ;equate x20000000 with some x
A   EQU 0x20000000
B   EQU 0x20000004
C   EQU 0x20000008
D   EQU 0x2000000C

__main
    ;A = 2
    MOVS R0, #2
    ;move pointer to =0x20000000
    LDR R7, =A
    ;Store R0 in memory cell of address R7
    STR R0, [R7]

    ;B = 4
    MOVS R0, #4
    LDR R7, =B
    STR R0, [R7]

    ;C = 6
    MOVS R0, #6
    LDR R7, =C
    STR R0, [R7]

    ;A+(C*B)-2
    LDR R7, =C
    LDR R0, [R7]
    LDR R7, =B
    LDR R1, [R7]
;   MUL R0, R1 ;C*B

;EDIT FIXED above line should be:
    MULS R0, R1, R0
;   This stores in location R0, multiplication R1, R0

    LDR R7, =A
    LDR R1, [R7]
    ADDS R0, R1 ;A+(C*B)
    SUBS R0, #2 ;(A+(C*B))-2

    ;D = R0
    LDR R7, =D ;storing result in D
    STR R0, [R7]

done
    B done
    END