开头
CISC(Complex Instruction Set Computing)
RISC(Reduced Instruction Set Computing)
MIPS是RISC的典型代表
RISC基本策略:
- 指令字长:所有指令长度都是1个字(32位)
- 寻址模式:基址+偏移量
- 访存:load与store
主流ISA:
- Intel 80x86 —— PC、服务器
- ARM(Advanced RISC Machine)—— 手机、平板
- PowerPC —— 航空电子设备、网络设备……
寄存器:
- 被内置于CPU中
- 速度极快(<1ns)
- 数量少
指令与立即数
MIPS内的寄存器:
- 数量为32个(编号为0~31)
- 宽度为32位
- 无正负
- 表示方法:$x(0<=x<=31)
MIPS指令的一般性语法格式: op dst, src1, src2
op:指令的基本功能
dst:保存结果的寄存器
src1:第一个操作数; src2:第二个操作数
加法操作:add dst, src1, src2
减法操作:sub dst, src1, src2
每条指令只有一种操作,每行一个指令
注释语句以“#”开始
0号寄存器($0 / $zero):0的专属寄存器,其值恒为零
立即数:指令中出现的常量数值
含有立即数的指令:op dst, src, imm
op+i表示对立即数的操作(eg:addi $s1, $s2, 5)
数据传输指令
由于MIPS只能对寄存器与立即数进行运算,因此必须有特定的数据传输指令实现主存单元与寄存器的数据交换
LOAD类:主存单元→寄存器
STORE类:寄存器→主存单元
数据传输的语法格式:op reg, off(base)
reg:操作的寄存器
base:存储基址的寄存器(因为是地址,base的值为无符号数)
off:偏移量(单位为字节,可正可负)—— 偏移量必须为4的倍数
读写的存储单元实际地址为:base+off
加载字:lw reg, off(base)
存储字:sw reg, off(base)
加载字节:lb reg, off(base) lbu为无符号扩展
存储字节:sb reg, off(base)
注意:读入字节最高位视为符号位,向高24位扩展
加载半字:lh reg, off(base) lhu为无符号扩展
存储半字:sh reg, off(base)
如果变量比寄存器多,则把常用的变量保存在寄存器中,其他不常用的保存在存储器中
大印第安:最高有效字节在字内的最低地址
小印第安:最高有效字节在字内的最高地址
MIPS基本决策机制
MIPS没有语句块的概念(不同于C语言的if-else、while等)
每条指令都对应一个word地址,使用标号标记其后的指令的地址 → **“标号名” + ‘:’ **
通过跳转机制调到标号处,实现转移
相等时转移(Branch If Equal):beq reg1, reg2, label
不等时转移(Branch If Not Equal):bne reg1, reg2, label
无条件转移(Jump):j label
C语言中for、while、do-while都可以改为MIPS
乘除法指令
乘除法指令结算结果不是直接写入32个通用寄存器中,而是保存在两个特殊寄存器HI与LO
2条专用指令读写HI/LO:
move from high:mfhi dst
move from low:mflo dst
乘法操作:mult src1, src2
LO保存结果的低32位,HI保存结果的高32位
除法操作:div src1, src2
LO保存商,HI保存余数
算术溢出
当计算结果的位数超出计算机硬件的实际可存储位数时,即为溢出
MIPS会检测溢出(溢出时产生错误),但是有unsigned关键字的算术指令忽略溢出
overflow detection | no overflow detection |
---|---|
add dst, src1, src2 | addu dst, src1, src2 |
addi dst, src1, src2 | addiu dst, src1, src2 |
sub dst, src1, src2 | subu dst, src1, src2 |
位运算指令
instruction | C | MIPS |
---|---|---|
and | a=b&c | and $s1, $s2, $s3 |
and immediate | a=b&0x1 | andi $s1, $s2, $s3 |
or | a=b|c | or $s1, $s2, $s3 |
or immediate | a=b|0x5 | ori $s1, $s2, $s3 |
not or | a=~(b|c) | nor $s1, $s2, $s3 |
exclusive or | a=b^c | xor $s1, $s2, $s3 |
exclusive or immediate | a=b^0xF | xori $s1, $s2, $s3 |
移位指令
移位的不同种类:
-
方向:左移&右移
-
性质:逻辑移位&算术移位
左移位低位补零;右移位:逻辑移位补0,算术移位补符号位
-
移位量:对于32位寄存器,移动位数合理最大取值为31,即0x1F
表示方式:5位的立即数&某寄存器的值(低5位有意义)
指令 | 功能 | 示例 |
---|---|---|
sll | 逻辑左移 | sll $dst, $src, imm/$x |
srl | 逻辑右移 | srl $dst, $src, imm/$x |
sra | 算数右移 | sra $dst, $src, imm/$x |
sllv | 逻辑可变左移 | sllv $dst, $src, imm/$x |
srlv | 逻辑可变右移 | srlv $dst, $src, imm/$x |
srav | 算数可变右移 | srav $dst, $src, imm/$x |
来源:CSDN
作者:喝杯Java都不行?
链接:https://blog.csdn.net/qq_43094622/article/details/104212894