4.5. MIPS¶
4.5.1. 简介¶
MIPS的意思是 “无内部互锁流水级的微处理器” (Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福大学 Hennessy 教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。
4.5.2. 指令特点¶
所有指令都是32位长
- 指令操作必须符合流水线
MIPS指令一次只能修改一个寄存器的值
3操作数指令
32个寄存器
没有条件标志位
4.5.3. 数据类型¶
所有MIPS指令都是32位
单个字符用单引号,例如:’b’
字符串用双引号,例如:”A string”
4.5.4. 寄存器¶
MIPS下一共有32个通用寄存器
在汇编中,寄存器标志由
$
符开头- 寄存器表示可以有两种方式
直接使用该寄存器对应的编号,例如:从
$0
到$31
- 使用对应的寄存器名称
例如:
$t1
,$sp
栈的走向是从高地址到低地址
4.5.4.1. 寄存器编号及其用途¶
寄存器编号 |
寄存器名 |
寄存器用途 |
---|---|---|
0 |
zero |
永远返回零 |
1 |
$at |
汇编保留寄存器 |
2-3 |
$v0 - $v1 |
存储表达式或者是函数的返回值 |
4-7 |
$a0 - $a3 |
存储子程序的前4个参数,在子程序调用过程中释放 |
8-15 |
$t0 - $t7 |
临时变量 |
16-23 |
$s0 - $s7 |
静态变量 |
24-25 |
$t8 - $t9 |
临时变量 |
26-27 |
$k0 - $k1 |
中断函数返回值 |
28 |
$gp |
指向静态数据块的中间地址 |
29 |
$sp |
栈顶指针 |
30 |
$fp |
帧指针 |
31 |
$ra |
返回地址 |
4.5.5. 读写操作¶
- load word
lw register_destination, RAM_source
- store word
sw register_source, RAM_destination
- store byte
sb register_source, RAM_destination
- load immediate
li register_destination, value
4.5.6. 寻址¶
- 直接寻址
la $t0, var1
- 间接寻址
lw $t2, ($t0)
- 偏移
lw $t2, 4($t0)
4.5.7. 算术指令集¶
- sub
sub $t2,$t3,$t4
$t2 = $t3 - $t4
- addi
addi $t2,$t3, 5
$t2 = $t3 + 5;
add immediate
- addu
addu $t1,$t6,$t7
# $t1 = $t6 + $t7;
add as unsigned integers
- subd
subu $t1,$t6,$t7
$t1 = $t6 + $t7;
subtract as unsigned integers
- mult
mult $t3,$t4
multiply 32-bit quantities in $t3 and $t4
store 64-bit result in special registers Lo and Hi
(Hi,Lo) = $t3 * $t4
- div
div $t5,$t6
Lo = $t5 / $t6
Hi = $t5 mod $t6
mfhi $t0
move quantity in special register Hi to $t0
mflo $t1
move quantity in special register Lo to $t1
4.5.8. 控制流¶
b target
unconditional branch to program label target
beq $t0,$t1,target
branch to target if $t0 = $t1
blt $t0,$t1,target
branch to target if $t0 < $t1
ble $t0,$t1,target
branch to target if $t0 <= $t1
bgt $t0,$t1,target
branch to target if $t0 > $t1
bge $t0,$t1,target
branch to target if $t0 >= $t1
bne $t0,$t1,target
branch to target if $t0 <> $t1
j target
unconditional jump to program label target
jr $t3
jump to address contained in $t3
jal sub_label
copy program counter (return address) to register $ra (return address register)