装配pi中不正确的添加问题?

Incorrect addition problem in assembly pi?

所以基本上这就是我正在尝试的程序 运行

.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

不完全是我在汇编中写的,但是相同的四个指令和相同的周期。

底线:只要上面的 assembly/disassembly 对你来说不是一件小事,你就应该远离汇编。