我们看函数调用,首先明确,ra是存着返回地址,s0是帧指针,
addi函数一开始先开辟栈空间(改变sp)
然后存下ra和s0
然后把s0指向栈底部,然后利用s0来吧局部变量存放再栈上,然后又放进寄存器进行add操作
最后程序结束,把上一个函数的返回地址和站栈指针设置好,然后指向ret
ret是伪指令,翻译过来是jalr x0,x1,0
x0 是0,x1是ra,所以实际上是设置pc为ra
这里说一下,调用这个函数的上一个函数,会有一个汇编是call symbol
也就是把调用指令的下一个指令的地址放进了ra,然后pc跳转至函数代码运行。这样我们就知道了
ra存放的其实是调用指令的下一条指令的地址作为返回地址,然后s0是调用函数的栈底地址