指令系统

指令集与计算机性能

mark

指令系统结构的分类

按照CPU中存放操作数的存储单元分三类
堆栈、累加器、通用寄存器组型三类
mark

其中寄存器型指令级架构又可细分为三类

  • 寄存器-寄存器型

    **(R**-**R**:register-register) 
    优点:指令字长固定
    缺点:指令条数多,目标代码不够紧凑,因而程序占用的空间比较大
  • 寄存器-存储器型

    **(R**-**M**:register-memory)
    优点:可以在ALU指令中直接对存储器操作数进行引用,容易对指令进行编码,目标代码比较紧凑
    缺点:指令的执行时钟周期因操作数的来源(寄存器或存储器)的不同而差别比较大。
  • 存储器-存储器型

    **(M**-**M**:memory-memory)
    优点:代码紧凑,不需要设置存储器来保存变量
    缺点:对存储器的频率访问会使存储器成为瓶颈
    

常用寻址方式

mark

控制指令分类

  • 分支”(Branch):而当控制指令是有条件改变控制流时,我们称之为“分支”

| 分支条件表示 | 优 点 | 缺 点 |
| ------------------------------- | ---------------- | -------------------------------------------------- |
| 条件码(CC) ALU设置特殊位 | 自由控制 | 限制了指令的执行顺序(检测之前需由指令生成条件码) |
| 条件寄存器 保存分支计算结果 | 简单 | 占用了一个寄存器 |
| 比较分支 | 一条指令实现分支 | 分支指令的操作增多,流水线中可能一拍做不完 |

  • 跳转”(Jump):当控制指令为无条件改变控制流时,我们称之为“跳转”
  • 过程调用” (Call)
  • 过程返回” (Return)
    过程调用和返回的状态如何保存?

调用者保存”(caller saving)方法:如果采用调用者保存策略,那么在一个调用者调用别的过程时,必须保存调用者所要保存的寄存器,以备调用结束返回后,能够再次访问调用者。
被调用者保存”(callee saving)方法:如果采用被调用者保存策略,那么被调用的过程必须保存它要用的寄存器,保证不会破坏过程调用者的程序执行环境,并在过程调用结束返回时,恢复这些寄存器的内容。

指令系统的发展方向

  • CISC Complex Instruction Set Computers 例如X86指令集
    CISC特点

指令能力强,指令是可变长格式
微程序控制技术实现

  • RISC Reduced Instruction Set Computers 例如ARM指令集
    RISC特点

选取使用频率最高的指令,并补充一些最有用的指令;
每条指令的功能应尽可能简单,并在一个机器周期内完成;
所有指令长度均相同
只有load和store操作指令才访问存储器,其它指令操作均在寄存器之间进行;
以简单有效的方式支持高级语言。

MIPS指令系统结构

MIPS是Load/Store型指令集结构

寻址方式

  • 寄存器寻址;如ADD R1,R2,R3
  • 立即值寻址;如ADD R1,R2,#42
  • 偏移寻址; 如ADD R1,R2,40(R3)
  • 寄存器间接寻址。存储器地址宽度为32位。 如ADD R1,R2,0(R3)

指令格式

I型指令

65516
操作码rsrt立即数

R型指令

655556
操作码rsrtrdshamt(位移量)func(选择op操作的某个特定变体)

J型指令

626
操作码与NPC(Next PC)相加的偏移量

注:rs、rt、rd一般分指第一第二个操作数及目的操作数。

    R0的值永远为0

MIPS操作

  • Load/Store操作
    mark
  • ALU操作
    MIPS中的所有ALU指令均为RR型或者寄存器-立即数型
  • 分支与跳转
    mark

BEQZ(branch if equal zero)
BNE(branch if not equal)

  • 浮点操作
    后缀S标识单精度,后缀D标识双精度如MOVD、SUBS
Last modification:April 17th, 2020 at 11:06 pm
如果觉得我的文章对你有用,请随意赞赏