概念:ATPCS即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称
参数规则:函数参数传递的时候,前4个参数通过r0-r3来传递,超过4个的参数通过栈来传递
- 如,传入abcd四个参数是通过r0-r3来传递, 当需要传ef的时候则通过压入栈来实现,所以寄 存器的效率比内存高
- 部分公司会规定函数参数的个数不超过4个,当 超过4个时要考虑编译器执行效率的问题
返回值规则 :栈模式规则 例函数返回值通过r0带回
问题1:为什么data作为局部变量,还能将值传出来?
- 通过寄存器获取,将data的值放到r0寄存器中
- 在调用后,获取的返回值从r0中读取即可
- 栈区空间正常释放,r0寄存器中的值不会消失
问题2:为什么*p打印出来还是100?
- 栈空间内容没有被释放,因为栈空间没有被重新划分
- 在打印之前调用其他函数,栈空间会被重新划分
栈模式规则:main函数编译完后,就是个标签Lable
mov ip, sp :把sp的值赋值给ip, ip是暂存sp的
stmfd sp!,{fp,ip,lr,pc}:
- 入栈操作,压入fp,ip,lr,pc, 而且加!表示sp 的值要减4次
- 先放哪个?fp还是pc? pc 要遵从大寄存器对大地址,小寄存器 对小地址
sub fp,ip ,#4:
- fp = ip - 4
- fp是栈增寄存器,记录的是栈的开始地址
- fp是栈开始,sp是栈结束,相减就是栈空间大小
sub sp,sp, #16 :总共有4个局部变量,argc argv i b 每个大小为4
str r0,[fp,# - 24] : argc
str r1,[fp,#-28] : argv 第一,二个参数靠r0,r1传递
mov r3,#0 对b,i 两个局部变量进行初始化 为0
mov r3,[fp,#-20] 对b,i 两个局部变量进行初始化 为0
mov r3,#0 对b,i 两个局部变量进行初始化 为0
mov r3,[fp,#-16] 对b,i 两个局部变量进行初始化 为0
局部变量初始化,首先是给局部变量 分配内存,然后再赋值,栈空间形成
b = i ++ + ++ i;被拆成这三部分进行运算
- i = i + 1 => i : 1
- b = i + i => b : 2
- i = i + 1 => i : 2
printf的第一个参数和第二个参数
ldr r0, .L3
ldr r1, [fp, #-20]
sub sp , fp, #12
main函数结束后退栈
sp一开始在-28这里 减后退到了-12
内存里面的值没有消失
- sub sp, fp, #12这里并没有清掉内存
- 要 时间,没必要清,后面会覆盖