title: 简单入门 MIPS
date: 2020-05-27 09:20:42
0. 前言
long long ago,接到一个 x86-64 转 MIPS64 的项目,最近开始。
先简单学习一下 MIPS32 。
参考:bilibili - 计算机组成原理(MIPS汇编语言) 袁春风 | 南京大学
1. 指令
1.1. MIPS指令概览
所有指令都是4字节,指令的地址都是4的倍数。
只有3种指令格式。
1.2. 3种指令中各字段的含义
1.3. 各指令的 OP 字段的编码/解码表
-
op=000000
:R-Type
-
op=000010/000011
:J-Type
-
op=others
:I-Type
1.4. R-Type 指令中,func 字段的编码/解码表
1.5. MIPS 寻址方式
-
I-Type
:- 基址或变址
- 相对寻址
-
J-Type
:- 伪直接寻址
MIPS 寻址方式由 op
字段确定。
1.6. 二进制与汇编间的转换举例
举例:指令二进制码转汇编形式:
举例:汇编形式转成二进制码:
1.7. 运算指令
MIPS没有标志位。
运算指令举例(若立即数大于16位,会有专门的指令去处理):
1.8. 数据传送指令
数据传送指令举例:
1.9. 跳转指令
MIPS中
jr
相当于call
指令,jal
相当于ret
指令。MIPS中只有等于和不等于两种分支跳转指令。
举例:
2. 寄存器
32个已编号的寄存器,3个特殊寄存器HI
、LO
、PC
。
32个寄存器的功能定义:
3. 存储器
4. 过程调用
示例与问题:
4.1. MIPS的过程调用
-
jr
相当于call
指令,jal
相当于ret
指令。 - 参数放在
$a0~$a3
寄存器中,返回值放在$v0~$v1
寄存器中,多余的放在栈上。 - 返回地址放在
$ra
即31号寄存器中。
4.2. MIPS的栈
- 没有
push
和pop
指令。
4.3. MIPS过程调用中寄存器的约定
被调用者需要保存的寄存器:
-
$ra
返回地址寄存器 -
$s0~$s7
保存寄存器
调用者需要保存的寄存器:
-
$a0~$a3
参数寄存器 -
$fp
帧指针寄存器(栈底寄存器) -
$t0~$t9
临时寄存器
示例一:
示例二: