ARM堆栈操作

时间:2017-09-02 10:58:57

标签: assembly arm

我有这个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

0 个答案:

没有答案