装配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 对你来说不是一件小事,你就应该远离汇编。
所以基本上这就是我正在尝试的程序 运行
.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 对你来说不是一件小事,你就应该远离汇编。