avatar

计组笔记
  • 陌生知识点

第二章 指令:计算机的语言

  • 背指令

  • 寄存器

    • 函数调用过程中
    寄存器 作用
    $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
Author: Michelle19l
Link: https://gitee.com/michelle19l/michelle19l/2020/04/06/计组笔记/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶