ALU指令
指令分类
- 计算:对寄存器值进行数学或逻辑计算
- 加载或存储:访问主存中的值
- 分支:改变PC值
所有指令等长(32位,占用主存里的一个单词)
- 简化控制逻辑单元的解码过程,易于计算下一个PC值
- 编码长度更长(固定长度编码)
每个操作有自己的符号名称,称为助记符(mnemonic),例如ADD
常数操作
将常数作为ALU指令的第二个操作数
在上述情况中,替换掉rb的五位,可以用最后的16位([15:0])表示一个常数
实践证明,对很多指令来说,以小常数作为第二个操作数是非常普遍的
需要注意的是,如果一个常量无法用16位正确表达,那么我们需要以32位的形式将它存储在主存中,像使用变量一样,使用时将其加载到寄存器中。
内存访问
由于Beta是加载-存储架构,所以加载和存储是访问内存值的唯一方法
示例
寄存器R31与0绑定
Reg[r0]<-Mem[Reg[r31]+sext(0x1008)]=Mem[0+sext(0x1008)]=x
Mem[Reg[r31]+sext(0x100C)]=Mem[0+sext(0x100C)]=y<-Reg[r0]
分支
分支表示执行序列中的潜在分叉。
offset
这里的分支使用的是PC相对地址,也就是说分支目标的地址是相对于分支的下一个指令的地址而言的。offset=0表示分支的下一个指令,offset=-1表示分支本身。
- 向后分支(backward branch):offset为负值,经常在循环结束的分支处使用,用于回到循环的开头
- 向前分支(forward branch):offset为正值,在if条件判断中需要向前跳过一些步骤时使用
跳转指令
分支指令可以将控制传递给由常数计算得的目标位置,JMP指令则可以将控制传递给预先计算好的地址。
将程序计数器设置为寄存器 "ra "的值。像分支一样,JMP将把PC+4的值写入指定的目标寄存器中。