目录
前言
计系3第一个实验就是MIPS指令集写汇编。。。在计系1和2的折磨 下,我们对汇编语言有了一定的认知,但是还是难顶 。考虑到之后还有大量的实验,姑且记录一下MIPS的一些特性,操作等等,方便后续查阅。
MIPS指令集简介
MIPS的分类,也要按照基本法 ,按照寄存器的位数可以分为 MIPS-32 和 MIPS-64。其中本篇博客主要介绍 MIPS-64 指令集。
Mips指令集是一套精简指令集,所以使用起来非常 蛋疼 高效快捷。
MIPS资源
在 MIPS 指令集中,有很多资源可供我们调用,比如寄存器资源,内存资源等等。
寄存器资源
首先介绍寄存器资源。相比于 LC-3 这种只提供8个寄存器的拉跨的指令集,MIPS提供了32个寄存器,供程序员使用。
其中寄存器按照 R0 到 R31 划分。但是为了显式地区分他们的用途,我们人为地将寄存器按照用途进行划分:
名称 | 别名 | 用途 | 被调用之前是否需要保存 |
---|---|---|---|
$zero | R0 | 常数寄存器 表示0 | 😅 |
$v0 ~ $v1 | R2 ~ R3 | 函数调用 – 返回值 | × |
$a0 ~ $a3 | R4 ~ R7 | 函数调用 – 参数 | × |
$t0 ~ $t7 | R8 ~ R15 | 临时寄存器 | × |
$s0 ~ $s7 | R16 ~ R23 | 普通的寄存器 | √ |
$t8 ~ $t9 | R24 ~ R25 | 临时寄存器 | × |
$gp | R28 | Global Pointer 全局指针 | √ |
$sp | R29 | Stack Pointer 栈指针 | √ |
$fp | R30 | Frame Pointer 栈帧指针 | √ |
$ra | R31 | Return Address 返回地址 | √ |
注意其中 $zero 寄存器是不可写的。所以我们无需考虑其保存问题。。。此外,虽然帧指针 $fp 也是需要保存的,但是实际编程中似乎并不需要我们显式地保存它~~(快进到 Stack.Overflow)~~
内存资源
存储器只能通过数据传输指令访问。MIPS将使用字节编址,这意味着连续的地址之间相差8bit。此外,存储器用于保存数据结构,数组和溢出的寄存器(比如函数形参多于4个,那么寄存器不够用了)
MIPS指令
MIPS指令集的指令非常精简,数目非常少(迫真)。其中指令又根据操作寄存器的数目,分为 R型指令 和 I型指令。
其中 R型指令使用三个寄存器,分别是 rs,rt,rd,分别表示 源1,源2,目的寄存器。
值得注意的是,R型指令在二进制编码中,寄存器的顺序是 rs, rt, rd,而汇编代码中,我们通常使用 指令 目的寄存器 源寄存器1 源寄存器2
这样的格式。这非常的反人类
再来看 I 型指令:I型指令使用两个寄存器,一个为源一个为目的寄存器。同样的,二进制编码和汇编代码的寄存器位置不统一 多捞哦 要注意顺序。。。
下面给出所有的MIPS指令: