Assembly 组装pi中存在不正确的添加问题?

Assembly 组装pi中存在不正确的添加问题?,assembly,raspberry-pi,arm,Assembly,Raspberry Pi,Arm,所以基本上这就是我要运行的程序 .data .balign 4 A : .word 4 B : .word 5 C : .word 2 D: .word 3 .text .global main main: ldr r0, addr_A ldr r0, [r0] ldr r1, addr_B ldr r1, [r1] ldr r2, addr_C ldr r2, [r2] ldr r3, addr_D ldr

所以基本上这就是我要运行的程序

.data

.balign 4

A : .word 4

B : .word 5

C : .word 2

D: .word 3

 

.text

.global main

main:

    ldr r0, addr_A
    ldr r0, [r0]
    ldr r1, addr_B
    ldr r1, [r1]
    ldr r2, addr_C
    ldr r2, [r2]
    ldr r3, addr_D
    ldr r3, [r3]
    mov r4, #4
    
    mul r0, r3
    mul r1, r2
    mul r2, r4
    add r3, r0, r1
    sub r3, r2
    bx lr
它应该运行方程:D=D+3A+2B–4C 但在这一行:

add r3, r0, r1
不是给我25,而是给了我22
我想知道这里出了什么问题?

你的计算错了。
您应该尽可能避免乘法,因为它需要三个周期加上三个周期的延迟

ldr     r0, addr_A
ldmia   r0, {r0, r1, r2, r3}

add     r3, r3, r0, lsl #1      // d = d + 2*a
sub     r1, r1, r2, lsl #1      // b = b - 2*c
add     r3, r3, r0              // d = d + a
add     r3, r3, r1, lsl #1      // d = d + 2*b
========================================================================

下面是方程式的编译过程:

uint32_t foo(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
{
    return d + 3*a + 2*b - 4*c;
}

foo
    SUB      r3,r3,r2,LSL #2
    ADD      r0,r0,r0,LSL #1
    ADD      r3,r3,r1,LSL #1
    ADD      r0,r3,r0
    BX       lr
不完全是我在汇编中写的,而是相同的四条指令和相同的周期


一句话:只要上面的汇编/反汇编对您来说不是一件小事,您就应该远离汇编。

您是否尝试过单步执行调试器,思考每个阶段哪个寄存器中应该包含什么,并与实际存在的内容进行比较?22是绝对正确的。有什么问题吗?@Jake'Alquimista'LEE:
3+3*4+2*5-4*2
17,如果我做得对的话。@PeterCordes stage1:4,5,2,3,4;第二阶段:12,10,8,22,4;r3在那一行是22 OP说代码产生22,但这不是他们想要的。解释代码生成22的原因并不正确。他们还声称,
25
对于那些输入的公式是正确的,但实际上是17,所以代码和他们的数学都是错误的,除非我遗漏了什么。
d+3*a+2*b-4*c
不是一个要解的方程,而是一个要求值的公式或表达式。