4.6. MIPS

4.6.1. 简介

MIPS的意思是 “无内部互锁流水级的微处理器” (Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福大学 Hennessy 教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。

4.6.2. 指令特点

  • 所有指令都是32位长

  • 指令操作必须符合流水线
    • MIPS指令一次只能修改一个寄存器的值

  • 3操作数指令

  • 32个寄存器

  • 没有条件标志位

4.6.3. 数据类型

  • 所有MIPS指令都是32位

  • 单个字符用单引号,例如:'b'

  • 字符串用双引号,例如:"A string"

4.6.4. 寄存器

  • MIPS下一共有32个通用寄存器

  • 在汇编中,寄存器标志由 $ 符开头

  • 寄存器表示可以有两种方式
    • 直接使用该寄存器对应的编号,例如:从 $0$31

    • 使用对应的寄存器名称
      • 例如: $t1 , $sp

  • 栈的走向是从高地址到低地址

4.6.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.6.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.6.6. 寻址

  • 直接寻址
    • la  $t0, var1

  • 间接寻址
    • lw  $t2, ($t0)

  • 偏移
    • lw  $t2, 4($t0)

4.6.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.6.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)