汇编语言之一——MIPS32指令集

· · 个人记录

这里介绍的是 MIPS32 Release 1 的指令集。

一、相关信息

内置寄存器

MIPS 是 32 位的 CPU,有 32 个 32 位的寄存器,用途如下图所示:

编号 助记符 用途
0 $zero 永远为 0
1 $at 保留寄存器,共汇编器使用
2-3 $v0-v1 保存表达式或函数返回结果
4-7 $a0-a3 作为函数的前 4 个参数
8-15 $t0-t7 供汇编程序使用的临时寄存器
16-23 $s0-s7 子函数使用时需要先保存原寄存器的值
24-25 $t8-t9 供汇编程序的临时寄存器,和 t0-t7 一样
26-27 $k0-k1 保留寄存器,中断处理函数使用
28 $gp 全局指针
29 $sp 堆栈指针,指向堆栈的栈顶
30 $fp 保存栈指针
31 $ra 返回地址

详细的解释:

虽然但是,上面的这些玩意仅仅是约定。实际上,除了 $0$31 之外,你都可以随便用。

特殊寄存器

程序计数器 PC,用于乘除运算的 HI 和 LO。

在乘法的时候 HI 保存高 32 位,LO 是低 32 位。

在出发的时候 HI 保存商,LO 是余数。

内存

### 数据类型 |C/C++ 的名称|MIPS 名称|字节|助记符| | :-----------: | :-----------: | :-----------: | :-----------: | |`long long`|`dword`|8|`d`| |`int`|`word`|4|`w`| |`short`|`halfword`|2|`h`| |`char`|`byte`|1|`b`| ## 指令 MIPS 是精简指令集(RISC),共有 3 种指令类型,好多条指令。 ### 寻址方式 (1)寄存器寻址:MIPS 算术运算指令的操作数必须从 32 个 32 位寄存器中选取。 (2)立即数寻址:以常数作为操作数,无须访问存储器就可以使用常数。因为常数操作数频繁出现,所以在算术指令中加入常数字段,比从存储器中读取常数快得多。 (3)基址或偏移寻址:操作数在存储器中,且存储器地址是某寄存器与指令中某常量的和。 (4)PC 相对寻址:跳转到后面某条指令。 (5)伪直接寻址:跳转地址 = PC 中原高 4 位 + 指令中的 26 位 + 00(32位地址)。 我们放一张 picture: ![](https://img-blog.csdnimg.cn/20190107134248719.PNG) ### 指令表 1. R 型指令(Register Format) 其他的乱七八糟指令: 指令格式: |6|5|5|5|5|6| | :-----------: | :-----------: | :-----------: | :-----------: | :-----------: | :-----------: | |op|rs|rt|rd|shamt|funct| 2. I 型指令(Immediate Format) 含有立即数的指令:读取数据,输出数据,分支,立即数。 |6|5|5|16| | :-----------: | :-----------: | :-----------: | :-----------: | |op|rs|rt|address| 3. J 型指令(Jump Format) 跳转指令。 |6|26| | :-----------: | :-----------: | |op|address| 下面的是所有的的指令: 1. 数据传送指令 sw ### 指令码 我只找到了 MIPS16 的 31 条指令: 参考资料: [MIPS 指令集及汇编完全解析](https://blog.csdn.net/qq_41191281/article/details/85933985) [MIPS 指令集(共 31 条)](https://blog.csdn.net/qq_41848006/article/details/82256626) [MIPS 汇编指令学习](https://www.cnblogs.com/CoBrAMG/p/9237609.html)