逻辑操作
sll 左移
srl 右移
and,andi 按位与
or,ori 按位或 (ori和andi 是与立即数进行逻辑或和逻辑与操作,立即数的高16位进行零扩展之后再与寄存器进行逻辑操作)
nor 按位取反
注意:立即数做加法运算时要进行符号扩展。
R型指令格式中的shamt字段在移位指令中表示移位量,移位操作机器指令:
例: sll $t2 , $s0 , 4
对应的机器指令是:
| 0 | 0 | 16 | 10 | 4 | 0 |
sll指令中的op和funct为0, $t0~ $t7 对应8~15, $s0 ~ $s7 对应16 ~ 23,对应上面rt和rd,第一个源操作数rs没用到,因此是0
and指令有掩码的功能(mask)
这里的按位取反nor指令实际上是not or(或非运算),这是为了保持三个操作数格式,当一个操作数为0时对于另一个操作数就是按位
取反指令。
例:nor $ t0, $ t1 ,$ t3 //register t0 = ~ (register t1 | register t3)
决策指令
beq registerl , register2 , Ll
该指令表示如果两个寄存器指令相等,则跳转至LI标签处指令执行
bne registerl, register2., Ll
如果两个寄存器的值不行等则条状至LI标签处执行
以上两个指令是条件分支指令
j EXIT
表示无条件分支指令,直接跳转至EXIT标签处
Else: sub $ s0 , $ s1,$ s2
上面Else:就是标签的表示方法
slt $t0, $s3, $s4 //t0=1 if $s3 < $s4
小于则置位指令
slti $t0, $s2,10 //t0= 1 if $s2 < 10
操作数有立即数
注意:slt 和slti指令用于处理有符号数,sltu和sltiu指令用于无符号数,MIPS编译器使用slt,slti,beq,bne和固定值0(总是可以通
过读取&zero寄存器获得)来创建所有比较条件。
汇编器完成地址计算任务
循环指令:
while ( save [ i ] == k )
i += 1;
数组基址存放在寄存器中,上述C语言程序可通过分支语句,逻辑指令即可表示
以分支指令结束的这类指令序列对编译非常重要,他们有专用名词:基本块。基本块是没有分支(分支出现在末尾除外),也没有分
标签(出现在开始除外)的指令序列。编译的最初阶段的任务之一是将程序分解为若干基本块。
case/switch语句:
一种实现方法是将其转化位if-else语句嵌套
另一种方法更有效:
将多个指令序列分支的地址编码为一张表,即转移地址表,每一个表项中的值是分支代码序列的起始地址(用标签指明),
需要跳转时需先将表项中的值提取到寄存器中,然后使用寄存器中的值进行跳转。
jr 指令用来无条件跳转至寄存器中的值指定的地址