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)

上一篇下一篇

猜你喜欢

热点阅读