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
不是一个要解的方程,而是一个要求值的公式或表达式。