- 陌生知识点
第二章 指令:计算机的语言
背指令
寄存器
- 函数调用过程中
寄存器 作用 $a0~a3 用于传递参数的四个寄存器 $v0~v1 用于返回值的两个值寄存器 $ra 用于返回起始点的返回地址寄存器 $t0~t9 10个临时寄存器,在过程调用中不必被调用者(被调用的过程)保存 $s0~t7 8个保留寄存器,在过程调用中必须被保存(一旦被使用,由被调用者保存和恢复) 保留 不保留 保存指针寄存器:$s0~s7 临时寄存器:$t0~t7 栈指针寄存器:$sp 参数寄存器:$a0~a3 返回地址寄存器: 返回值寄存器:$v0~v1 栈指针以上的栈 栈指针一下的栈 名称 寄存器号 用途 调用时是否保存 $zero 0 常数0 不适用 $v0~v1 2~3 计算结果和表达式求值 否 $a0~a3 4~7 参数 否 $t0~t7 8~15 临时变量 否 $s0~s7 16~23 保存的寄存器 是 $t8~t9 24~25 更多的临时变量 否 $gp 28 全局指针 是 $sp 29 栈指针 是 $fp 30 帧指针 是 $ra 31 返回地址 是
叶函数调用示例
C:
int fact (int n)
{
if (n<1) return 1
else return (n*fact(n-1));
}MIPS
fact:
addi $sp, $sp, -8; # adjust stack for 2 items
sw $ra, 4($sp); # save the return address
sw $a0, 0($sp); # save the argument n
stli $t0, $a0, 1 # test for n<1
beq $t0, $zero, L1 # if n >= 1, go to L1
addi $v0, $zero, 1 # reurn 1
addi $sp, $sp, 8 # pop 2 items off stack
jr $ra # return to caller
L1: addi $a0, $a0, -1 # n >= 1: argument gets (n-1)
jal fact # call fact with (n-1)
# fact 的返回位置
lw $a0, 0($sp) # return from jal: restore argument n
lw $ra, 4($sp) # restore the return address
addi $sp, $sp, 8 # adjust stack pointer to pop 2 items
mul $v0, $a0, $v0 # return n*fact(n-1)
jr $ra #return to the caller
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.