LC3 Stack

作者: Neuroway | 来源:发表于2018-05-25 02:40 被阅读0次

    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)

    相关文章

      网友评论

          本文标题:LC3 Stack

          本文链接:https://www.haomeiwen.com/subject/gwaejftx.html