系列文章目录
文章目录
逻辑操作
对位进行处理的指令
| 逻辑操作 | C | Java | MIPS |
| 左移 | << | << | sll |
| 右移 | >> | >>> | srl |
| 按位与 | & | & | and,andi |
| 按位或 | | | | | or,ori |
| 按位取反 | ~ | ~ | nor |
- 打包和拆包操作
- 用于对字中的若干“位”
移位操作(SLL,SRL)
MIPS移位指令分为6个字段

- shamt:移位次数
- sll:逻辑左移
- 左移空位填0
- 逻辑左移i位相当于乘
- srl:逻辑右移
- 逻辑右移空位填0
例如,假设寄存器¥s0中的数据时:
0000 0000 0000 0000 0000 0000 0000 1001 = 9
一条左移指令执行后:
0000 0000 0000 0000 0000 0000 1001 0000 = 144
在MIPS中,左移指令类似于:

按位与(AND)
该操作仅当两个操作位均为1时结果才为1。例如,如果寄存器$t2的值为:
0000 0000 0000 0000 0000 1101 1100 0000
寄存器$t1的值为:
0000 0000 0000 0000 0011 1100 0000 0000
那么,在执行下面的MIPS指令后
and $t0,$t1,$t2
$t0中的值将是:
0000 0000 0000 0000 0000 1100 0000 0000

AND提供了一种将源操作数的某些位置置为0的能力,前提是另一个菜哦指数中对应位是0。后一个操作数传统上被称为掩码(mask),寓意其可“隐藏”某些位
按位或(OR)
该操作在两个操作位中任意一位是1时,结果就为1。为详细说明,仍假设$t1,$t2中的值与上述一样,那么执行下述按位或指令后:
or $t0,$t1,$t2
执行后$t0为:
0000 0000 0000 0000 0011 1101 1100 0000

按位取反(NOT)
该操作只有一个操作数,将1变为0,将0变成1。为保持三操作数的格式,MIPS引入了或非NOR(NOT OR)指令来取代NOT。如果一个操作数是0,那么对另一个操作数而言,结果就等价于NOT
如果寄存器$t1中的值与上例保持不变,那么下面MIPS指令:
nor $t0,$t1,$zero
在寄存器$t0中的执行结果是:
1111 1111 1111 1111 1100 0011 1111 11111


决策(分支)指令
条件分支指令
程序语言通常使用if语句描述决策,有时也使用go to 语句和标签。MIPS汇编语言中有两条类似if和go to 语句功能的指令。第一条是:
beq rs,rt,L1
即 if(rs==rt)跳转到标签为L1的指令执行
第二体条指令是:
bne rs,rt,L1
即 if(rs!=rt)跳转到标签为L1的指令执行
这两条指令传统上称为条件分支(conditional branch)指令
无条件分支语句
在if语句结尾部分,需要引入另一种分支指令,通常叫做无条件分支指令(unconditional branch)。当遇到这种指令时,程序必须分支。为了区分条件分支和无条件分支,MIPS将无条件分支指令命名为jump,简写成j
j Exit

循环语句

基本块
一个基本块时一个指令序列,没有分支(可能出现在末尾者除外)并且没有分支目标/分支标签(可能出现在开始者除外)的指令序列
- 编译器标识基本块用于优化
- 高级处理机能够加速基本块的执行

更多条件操作
最常见的判断就需要判语句可能是相等或不等,但是有时判断一个变量是否小于另一个变量也非常有用。例如,for循环断索引变量是否小于0。在MIPS中,提供了一条指令来实现这种比较,该指令在比较两个寄存器内容后,若第一个寄存器小于第二个寄存器,则将第三个寄存器设置为1,否则设置为0,该指令称为小于则置位(set on less than),即slt
slt $t0,$t3,$t4
表示当寄存器$t3的值小于寄存器$s4的值时,寄存器$t0被置为1,否则寄存器$t0被置为0
在比较中经常使用常数操作数,所以有立即数版本的小于则位指令
slti $t0,$s2,10
beq,bne 可以和其他指令结合使用
slt $t0,$s1,$s2
bne $t0,$zero,L
没有blt,bge等指令
遵循冯诺依曼关于“设备”简单性原则,MIPS体系结构没有提供“小于则分支”指令,因为这种指令过于复杂,它会延长时钟周期时间,或增加平均执行每条指令的周期数CPI
有符号数和无符号数对比
- 有符号数比较:slt,slti
- 无符号数比较:sltu,sltui

将有符号数作为无符号数比较,在检查 0≤x<Y的同时,检查X是否为负数,检查数组下标是否越界
设计原则总结
- 设计原则一:简单源于规整
- 以算数运算操作为例:每条指令有且仅有三个操作数
- 规整使实现简单
- 简单能获得低成本高性能
- 设计原则二:越小越快
- 相对主存:数以万计的存储位置
- 寄存器只存储少量、频繁用到的数据
- 设计规原则三:加速执行常用操作
- 小常数操作出现的频率高
- 立即数操作用不到内存取数
- 设计原则四:优秀的设计需要适宜的折中方案
- 不同类型指令采用不同的解码方式
- 所有指令相同长度:32为,尽可能保持相似的指令格式
&spm=1001.2101.3001.5002&articleId=141633916&d=1&t=3&u=0601b633334a47fbb6adaa16913994d4)
2万+

被折叠的 条评论
为什么被折叠?



