Assembly 臂组件,;在循环后使用ldr保持相同的r2
我不熟悉arm汇编语言。 在结束循环后,我试图用相同的r0值继续加载r2。但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化。我应该怎么做来修复它,以便我可以使用与r0相同的值来ldr r2Assembly 臂组件,;在循环后使用ldr保持相同的r2,assembly,arm,Assembly,Arm,我不熟悉arm汇编语言。 在结束循环后,我试图用相同的r0值继续加载r2。但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化。我应该怎么做来修复它,以便我可以使用与r0相同的值来ldr r2 .syntax unified .global main .type main, %function main: ldr r1, =storage @ your code starts here bl addvalue initial_pointer: addvalue:
.syntax unified
.global main
.type main, %function
main:
ldr r1, =storage
@ your code starts here
bl addvalue
initial_pointer:
addvalue:
stmdb sp!,{fp,lr}
add fp,sp,#4
sub sp,#4
str r0,[fp,#-8]
ldr r0,[r1],4
str r0,[sp,4]! @provide r0 to next branch
bl get_loop
add sp,#4
add sp,#4
ldmia sp!,{fp,lr}
bx lr
get_loop:
stmdb sp!,{fp,lr}
add fp,sp,#4
sub sp,#4
ldr r2,[fp,#4] @load r2 with the value of r0
bl loop
add sp,4
ldmia sp!,{fp,lr}
bx lr
loop:
cmp r2,0 @loop control
beq get_loop
sub r2,1
b loop
b main
.size main, .-main
.data
storage:
.word 5, 3, 2, 1
但是,当我第二次运行代码ldr r2[fp,#4]时,值发生了变化
因为fp
已更改,所以您正在读取不同的内存地址
stmdb sp!,{fp,lr} # sp is changed here by 2regs * 4Bytes = 8Bytes
add fp,sp,#4 # fp = sp from previous iteration - 8 + 4
bl-loop
+beq-get\u-loop
不酷。若你们调用了一个“函数”,你们就可以正确地从函数返回,而不是通过简单的“分支”返回,为什么addvalue
看起来像是除了增加值以外的任何东西呢?