int f2(int a,int b)
{
int ret;
int lla=0x55;
int llb=0x33;
ret=a+b;
return ret;
}
一个非常简单的C函数,主要用来说明参数和局部变量在堆栈里的分配,入栈操作看明白了,但出栈操作看不明白!
-> l 0x00203470
f2:
00203470 e1a0c00d MOV r12,sp
00203474 e92dd800 STMDB sp!,{r11,r12,lr,pc}
00203478 e24cb004 SUB r11,r12,#4
0020347c e24dd014 SUB sp,sp,#0x14
00203480 e50b001c STR r0,[r11,#-0x1c]
00203484 e50b1020 STR r1,[r11,#-0x20]
00203488 e3a03055 MOV r3,#0x55
0020348c e50b3014 STR r3,[r11,#-0x14]
00203490 e3a03033 MOV r3,#0x33
00203494 e50b3010 STR r3,[r11,#-0x10]
00203498 e51b201c LDR r2,[r11,#-0x1c]
0020349c e51b3020 LDR r3,[r11,#-0x20]
002034a0 e0823003 ADD r3,r2,r3
002034a4 e50b3018 STR r3,[r11,#-0x18]
002034a8 e51b3018 LDR r3,[r11,#-0x18]
002034ac e1a00003 MOV r0,r3
002034b0 e24bd00c SUB sp,r11,#0xc
002034b4 e89da800 LDMIA sp,{r11,sp,pc}
/* globals */
FUNC_EXPORT(getImmr) /* return the SMP CPU number */
FUNC_EXPORT(getSP)
FUNC_EXPORT(getSP1)
FUNC_BEGIN(getImmr)
MOV r0,#0x35
MOV pc,lr
FUNC_END(getImmr)
FUNC_BEGIN(getSP)
MOV r0,r13
MOV pc,lr
FUNC_END(getSP)
FUNC_BEGIN(getSP1)
mov r12,sp
sub sp,sp,#4
str r1,[sp]
LDR r1,=#0x1000
str sp,[r1]
ldr r1,[sp]
add sp,sp,#4
MOV pc,lr
FUNC_END(getSP1)
-> d 0x169cf50,50,4
NOTE: memory values are displayed in hexadecimal.
0x0169cf50: 00000055 00000044 00000022 00000011 U…D…”…….
0x0169cf60: 21de7754 55aaaa55 cc33cc33 0169cfd4 Tw.!U..U3.3…i.
0x0169cf70: 0169cf7c 00203604 002033d4 00203470 |.i..6 ..3 .p4 .
0x0169cf80: 00000000 002610b8 00000000 eeeeeeee ……&………
0x0169cf90: 00000001 00000002 00000003 00000004 …………….
0x0169cfa0: 00000005 12345678 00000011 00000022 ….xV4…..”…
0x0169cfb0: 00000033 00000044 00000055 00000000 3…D…U…….
0x0169cfc0: 00000000 00000000 00000000 0169cfd8 …………..i.
0x0169cfd0: 002610ec 0020347c 00000004 00000005 ..&.|4 ………
0x0169cfe0: 00000006 00000007 00000008 00000009 …………….
0x0169cff0: 00000000 00000001 00000002 00000003 …………….