【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>   ;main的地址为10

00000008 <halt_loop>:
   8:	eafffffe 	b	8 <halt_loop> ; 死循环
   c:	40001000 	andmi	r1, r0, r0 ;1000的16进制是4096

00000010 <main>:
  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个出来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值