基于堆栈模式的程序执行模型决定了函数是语言的一个核心元素。分析Go函数的内部实现,对理解整个程序的执行模型有很大好处。研究底层实现有两个方法一种是看语言编译器源码,分析其对函数的各个特性的处理逻辑,一种是反汇编,将可以执行的程序反汇编出来。
// 开辟栈空间,压找PB保存现场
SUBQ$x,SP//为函数开辟栈空间
MOVQBP,y(SP)//保存当前函数BP到y(SP)位置,y为相对SP的偏移量
LEAQy(SP),BP//重置BP,使其指向刚刚保存BP旧值的位置,这里主要是方便后续BP的恢复
//弹出栈,恢复BP
MOVQy(SP),BP//恢复BP的值为调用前的值
ADDQ$x,SP//恢复SP的值为函数开始时的值
抽象的寄存器
SB 静态基址寄存器,全局变量的地址
FP 栈帧寄存器,指向当前函数调用栈帧的底部位置
PC程序计数器,存放下一条指令的执行地址
SP栈顶寄存器,用于函数调用前由主函数设置SP的值对栈空间进行分配和回收
函数调用