我有这个ARM代码,它是小端的。标有*
的车道有问题 AREA datos, DATA, READWRITE
resultado SPACE 4
pila SPACE 20
topPila
AREA prog, CODE, READONLY
ENTRY
ldr sp, =topPila
mov r0, #15
mov r1, #4
stmfd sp!, {r0, r1}
bl sbr_calculo
ldmfd sp!, {r2}
ldmfd sp!, {r0, r1}
ldr r4, =resultado
str r2, [r4]
b fin
sbr_calculo
sub sp, sp, #4
push {r5,r6,r7,lr} *
ldr r5, [sp, #20] *
ldr r6, [sp, #27] *
mov r7, #0
mov pc, lr
fin
END
以下是记忆地址:
mem32[0x40000060] = 00 00 00 00
mem32[0x4000005C] = 04 00 00 00
mem32[0x40000058] = 0F 00 00 00
mem32[0x40000054] = 00 00 00 00
mem32[0x40000050] = 14 00 00 40
mem32[0x4000004C] = 00 00 00 00
mem32[0x40000048] = 00 00 00 00
mem32[0x40000044] = 48 00 00 40
1 - 当我执行push {r5,r6,r7,lr}
时,sp的值为0x40000054
,我不会理解为什么加载的第一个值是lr值0x40000014
和它不会只加载4个字3,因为在mem32[0x40000044]
我认为推送中使用的寄存器应该有一个值,但是有0x4000048,这是标签{{1}的值}。
2-这没关系,我把地址sp +#20的值加载到r5,这是resultado
的值,r5是0x00000004
3-这里我将地址sp +#27的值加载到r6中,这是mem32[0x4000005C]
的值,但我不明白为什么r6是mem32[0x4000005F