前提
芯片模拟器中纯汇编,还不是常规汇编,编程难度太大,于是需要从软件层面上模拟循环、函数调用等。实现函数调用的时候,总觉得有哪些不对,于是详细思考了一下函数调用本身的作用。
函数调用
函数调用本身的作用:
- 开辟一片局部数据空间;
- 跳转到相应代码段;
具体的效果是这样的,多次调用某一个函数func()时,都会跳转到指令空间的某个位置,这样可以大大降低指令空间的总体大小。每次调用函数func()时,其实都会在栈上开辟一块独立空间。
函数调用 = 指令空间中相同的代码 + 栈段上的独立空间
我的设计:
我只考虑了独立空间的开辟,最近太着眼于这方面,忽略了与之前跳转的结合。
我现在打算这样实现模拟的函数调用:
- 调用regSave()函数,将当前函数的寄存器数据写入内存;
- 利用调用寄存器进行参数的接收;
- 执行JUMPL指令跳转到功能执行部分;
- 执行功能执行部分指令;
- 执行JUMPR指令返回上一层函数;
- 代用regRestore()函数,恢复现场;
由于是寄存器编程,和高级语言的函数调用略有不同。