(1) 在MIPS中,一个字的地址必须是4的倍数,这叫做严格对齐。(alignment restriction)
(2) MIPS采用big endian.
(3) MIPS寻址时,偏移量先乘4再和首地址相加。
(4)
name | register number | usage |
$zero | 0 | 常数0 |
$v0-$v1 | 2-3 | 结果和表达式的值 |
$a0-$a3 | 4-7 | arguments |
$t0-$t7 | 8-15 | 临时结果 |
$s0-$s7 | 16-23 | saved |
$t8-$t9 | 24-25 | 临时结果 |
$gp | 28 | 全局指针 |
$sp | 29 | 栈指针 |
$fp | 30 | frame 指针 |
$ra | 31 | 返回地址 |
(5) 汇编指令的二进制数值形式就叫做机器语言。多条这样的指令就是机器码。MIPS指令长度为32比特,其中含有若干个field,每个field有固定的比特。
MIPS 有三种指令格式,R格式,I格式和J格式。
R格式:基本运算指令的格式
域大小 | 6比特 | 5比特 | 5比特 | 5比特 | 5比特 | 6比特 |
R格式 | 操作码 | 存放第一个操作数的寄存器 | 存放第二个操作数的寄存器 | 存放结果的寄存器 | 位移量 | function code |
I格式:传输指令,分支指令,和立即数指令的格式
域大小 | 6比特 | 5比特 | 5比特 | 16比特 |
I格式 | 操作码 | 存放第一个操作数的寄存器 | 存放第二个操作数的寄存器 | 内存地址或者立即数 |
J格式:跳转指令的格式
域大小 | 6比特 | 26比特 |
J格式 | 操作码 | 目标地址 |
(6) MIPS采用NOR指令来替代NOT指令
A NOR 0 = NOT (A OR 0)= NOT(A)
(7) basic block的概念
一个指令序列,序列中米有分支指令(除了在序列的尾部),也没有branch target或者branch label(除了在分支的首部)。编译过程中就会把一个程序分成若干个basic block.
(8) MIPS编译器使用slt (set on less than), slti, beq (branch if equal), bne (branch if not equal)四条指令和0值来实现所有的条件跳转:等于,不等于,小于,小于或等于,大于,大于或等于。
(9) jump register指令
对于case和switch语句,MIPS使用一个jump address table来实现,该表含有需要跳转到的不同目标指令的地址。它实际上是一个元素为地址的数组。为了支持这种情况,MIPS设有一个jump register指令(jr),该指令无条件地跳转到一个存放在寄存器中的内存地址。
(10) MIPS中的字节指令
MIPS提供了对字节操作的指令。lb指令从内存获取一个字节,将其放在一个寄存器的最右边的8位。sb指令将一个寄存器的最右边8位取出并将其写入内存。相对应的两个字节的操作指令是lh和sh。h代表halfword。
(11) c中的字符和java中的字符
C语言中的字符占8比特,而Java中的字符占16比特。