LC3 Stack
2018-05-25 本文已影响0人
Neuroway
Stack 函数调用指南
1. 函数调用的标准:
R6 作为TOS(Top of stack) 栈顶(又叫 Stack Pointer / ESP)
R7 作为Return Address Pointer
R5 作为 Frame Pointer
2. 核心的Frame
一个函数运行会需要记录参数、内部局部变量,返回值,返回地址等信息
以上信息的排列就是一个Frame
--------- Frame顶部 ---------
最后一个本地局部变量
...
本地变量3
本地变量2
本地变量1
FP -- Parent Frame Pointer( 上层FP的地址 )
RA -- Return Address(返回的地址)
RV - Return Value
参数n
...
参数2
参数1
--------- Frame 底部 ---------
在函数运行时,R5一般指向本层Frame的FP(储存了上层FP指针的内存单元的地址)
R6 一般是指向栈顶,每次在栈上申请内存时就会移动R6,在调用子函数,写入传入的变量时,也需要移动R6,自函数
调用子函数
int main(){
short d;
d = foo(a,b,c)
}
在main调用foo的过程
(local) d = 0 <- TOS
FP = 全局入口
RA = 全局结束
RV = 0
main准备调用 :1.移动TOS,2. 写入参数a,b,c 3.保存重点寄存器,调用
foo 接受调用 : 1. 保存上一层FP,RA 2.移动FP到本层FP对应位置,3. 申请局部变量,移动TOS
foo返回: 1.写入返回值到RV位置,2.恢复上级FP,RA 3移动TOS到RV 4.RET
main 接受返回值,从TOS拿到返回值,修正TOS到调用之前的位置(+1)