第一可以把代码的位置恢复到之前的状态
第二可以把栈的状态恢复到调用之前的状态
所以记录老的bp就是为了调用结束恢复用的
然后再给栈 增加一些空间
存局部变量 这里的局部变量只有一个ret
然后执行 ret = a+b
首先要把赋值的部分ret地址存下来
等赋值完成之后 有个地方去装这个结果
所以需要把这个地址拿出来
由于它是第一个局部变量 那么就是栈基减1的位置
所以通过LEA -1 把它的地址拿出来
存到了所谓的ax寄存器里了
即执行完了之后 ax寄存器就会是ret的地址
把这个地址存放到栈里面 所以会有一个push的操作
暂存到栈里面
假设是330330
这个时候ax就是空闲的 就可以用来计算了
add指令是把ax里面的内容和stack peek(栈顶)的内容相加 然后存回ax
并且把栈顶销毁
先把a拿出来
它在基于bp的上三格的位置
所以是LEA 3
拿到了这个地址 然后加载到ax中
然后加了一个整数LI
把ax数据加载到栈里
栈顶就变成了3
然后再把第二个参数 就是bp的上两位
拿到这个地址之后 就可以把数据加载到ax中
ax就等于4了
此时栈顶就是3 ax就是4
调用ADD方法 把栈顶销毁
并且把它加到4里面
ax就等于7了
这个时候加法就完成了 然后就是赋值语句
找到ret地址
因为栈顶已经已经销毁了 所以sp在这里
然后把ax数据存到sp对应的地址里面即SI(save integer)方法
save完了之后 存地址的栈也会销毁
然后把7写进去
然后return这个变量
就是第一个局部变量 bp-1的位置
然后把bp-1的位置继续加载进入ax
因为返回值在ax里面 所以还得lea bp-1
ret的内容又回到了ax里面
然后再return
看看retuan干了什么
首先sp=bp
无论有多少个局部空间 这些空间都会被销毁
bp等于sp里面的地址
sp里面具体的值 也就是main bp
所以bp又回到了老bp的位置
sp+1了 所以新的bp也被销毁了
430428的位置
也就是调用call之后的位置
darg2(delete stack frame for args)
为参数做的这个空间 然这个空间delete掉
然后sp继续加加 430428被销毁
delete带的参数是2 就会会被3和4这两个参数delete掉
然后sp又回到了这个位置
像一切都未发生过一样
Native-Call
这里就是完全copy from c4
IO相关指令
OPEN/CLOS/READ/
为什么没有write
因为c4设计Native-CALL主要是为了完成自举 c4的源码里面没有用到write方法
PRTF:将数据写到标准输出(fd=1)
动态内存相关指令
- MALC
- FREE
- MSET
- MCMP
- EXIT 用于终结程序