MIPS学习笔记(1)

那年仲夏 提交于 2020-02-07 20:19:27

开头

CISC(Complex Instruction Set Computing)

RISC(Reduced Instruction Set Computing)

MIPS是RISC的典型代表

RISC基本策略:

  1. 指令字长:所有指令长度都是1个字(32位)
  2. 寻址模式:基址+偏移量
  3. 访存:load与store

主流ISA:

  1. Intel 80x86 —— PC、服务器
  2. ARM(Advanced RISC Machine)—— 手机、平板
  3. PowerPC —— 航空电子设备、网络设备……

寄存器:

  1. 被内置于CPU中
  2. 速度极快(<1ns)
  3. 数量少

指令与立即数

MIPS内的寄存器:

  1. 数量为32个(编号为0~31)
  2. 宽度为32位
  3. 无正负
  4. 表示方法:$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

移位指令

移位的不同种类:

  1. 方向:左移&右移

  2. 性质:逻辑移位&算术移位

    左移位低位补零;右移位:逻辑移位补0,算术移位补符号位

  3. 移位量:对于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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!