【ATPCS】ARM架构中函数的调用和被调用的关系

什么是ATPCS?

ATPCS即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)
应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。
–来自百度百科:ATPCS

什么协议呢?

调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。

下面是ARM架构的寄存器表格:(来自ATPCS.PDF)
ATPCS.PDF

R0-R3是用于传递参数值给程序;从程序中传出结果值;不超出程序范围内保持中间值。如果参数过多,那么就要用堆栈技术去传参了。
R4-R11保存程序的局部变量,常标为V1-V8。其中只有V1-V4能够无变化的在Thumb指令集下使用。
R12成为IP寄存器,用于在子程序中的调用时保存中间值。
R12-R15拥有特殊的角色。他们被标为IP,SP,LR,PC。
IP:内部程序调用寄存器

下面来看看一份简单的反汇编:
Disassembly of section .text:

00000000 <_start>:
   0:	e59fd004 	ldr	sp, [pc, #4]	; c <.text+0xc> 设置栈,即sp为0x40001000
   4:	eb000001 	bl	10 
;main的地址为10 00000008 : 8: eafffffe b 8 ; 死循环 c: 40001000 andmi r1, r0, r0 ;1000的16进制是4096 00000010
: 10: e1a0c00d mov ip, sp ;ip来保存sp的值 14: e92dd800 stmdb sp!, {fp, ip, lr, pc} 将这四个寄存器的值保存在sp对应的内存 18: e24cb004 sub fp, ip, #4 ; 0x4 1c: e24dd008 sub sp, sp, #8 ; 0x8 20: e3a03456 mov r3, #1442840576 ; 0x56000000 24: e2833050 add r3, r3, #80 ; 0x50 28: e50b3010 str r3, [fp, #-16] ;为了把0x56000050压入栈中 2c: e3a03456 mov r3, #1442840576 ; 0x56000000 30: e2833054 add r3, r3, #84 ; 0x54 34: e50b3014 str r3, [fp, #-20] ;为了把0x56000054压入栈中 38: e51b2010 ldr r2, [fp, #-16] ;读取0x56000050 3c: e3a03c01 mov r3, #256 ; 0x100 40: e5823000 str r3, [r2] 把0x100赋值给地址为0x56000050的寄存器 44: e51b2014 ldr r2, [fp, #-20] 48: e3a03000 mov r3, #0 ; 0x0 4c: e5823000 str r3, [r2] 50: e3a03000 mov r3, #0 ; 0x0 54: e1a00003 mov r0, r3 58: e24bd00c sub sp, fp, #12 ; 0xc; sp=fp-12 5c: e89da800 ldmia sp, {fp, sp, pc} 把sp值连续读3个出来

你可能感兴趣的:(#,ARM_linux)