暑期留校 DAY16

BugEater / 2023-08-02 / 原文

熬夜猛补RISCV中........
'sp'寄存器保存的是栈顶的位置
ra寄存器保存的是函数调用完成后返回调用者的地址。举个栗子~
`main:
...
call func # 调用func函数
...
jr ra # 返回到调用main函数的地址

func:
...
jr ra # 返回到调用func函数的地址`

当程序执行到call func指令时,它会将main函数调用call func指令之后下一条指令的地址(即call func指令的下一条指令地址)保存在ra寄存器中。然后,程序会跳转到func函数的入口地址开始执行func函数的代码。当func函数执行完毕后,程序会从ra寄存器中恢复之前保存的返回地址,也就是main函数调用call func指令之后下一条指令的地址。接着,程序会执行jr ra指令,将控制权交给main函数,并从main函数的下一条指令处继续执行。
然后为了防止ra,s0这种重要寄存器被调用函数时发生篡改,通常在函数定义的汇编的开始部分就把ra,s0这种寄存器保存到栈中

a0通常用于保存函数调用时的第一个参数,只有一个参数的情况下可以用作保存函数返回值