指令: 是指示计算机执行某种操作的命令, 是计算机运行的最小功能单位. 一台计算机的所有指令的集合构成该机的指令系统, 也称为指令集. 一台计算机只能执行自己指令系统中的指令, 不能执行其他系统的指令

周期: 取指令, 译码/取寄存器, 执行/有效地址/完成分支, 访问内存, 存储结果

指令格式

操作码(OP) + 地址码(A)

根据地址码数目

零地址指令

image-20250119222026282

一地址指令

image-20250119222030984

二地址指令

image-20250119222037809

三地址指令

image-20250119222042479

四地址指令

image-20250119222050084

根据指令长度

  • 指令字长: 一条指令的总长度(可能会变)

  • 机器字长: CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)

  • 存储字长: 一个存储单元中的二进制代码位数(通常和MDR位数相同)

  • 半字长指令, 单字长指令, 双字长指令 —— 表示指令长度是机器字长的多少倍

定长指令字结构

  • 指令系统中所有指令的长度都相等

变长指令字结构

  • 指令系统中各种指令的长度不等

根据操作码长度

定长操作码

  • 指令系统中所有指令的操作码长度都相同

  • 控制器的译码电路设计简单, 但灵活性较低

可变长操作码

  • 指令系统中各指令的操作码长度可变

  • 控制器的译码电路设计复杂, 但灵活性较高

定长指令字结构 + 可变长操作码 —— 扩展操作码指令格式(不同地址数的指令使用不同长度的操作码)

根据操作类型

数据传送类

  • 进行主存与CPU之间的数据传送

    image-20250119222057974

运算类

  • 算术逻辑操作

    image-20250119222103764

  • 移位操作

image-20250119222107644

程序控制类

  • 改变程序执行的顺序

    image-20250119222112365

输入输出类(I/O)

  • 进行CPU和I/O设备之间的数据传送

    image-20250119222116558

扩展操作码设计

  • 一种设计方案

image-20250119222121632

  • 设计扩展操作码指令格式的注意事项

    • 不允许短码是长码的前缀, 即短操作码不能与长操作码的前面部分的代码相同 (类比哈夫曼树)
    • 各指令的操作码一定不能重复
  • 优点

    • 在指令字长有限的前提下仍保持比较丰富的指令种类
  • 缺点

    • 增加了指令译码和分析的难度, 使控制器的设计复杂化

例题

image-20250119222129309

指令寻址

下一条欲执行指令地址(始终由程序计数器PC给出)

顺序寻址

定长指令字结构

image-20250119222133362

image-20250119222138028

变长指令字结构

image-20250119222142747

跳跃寻址

image-20250119222148019

数据寻址

确定本条指令地址码指明的真实地址

image-20250119222154163

直接寻址

  • 指令字中的形式地址A就是操作数的真实地址EA, 即EA = A

image-20250119222200314

  • 一条指令的执行, 共访存2次

    • 取指令 访存1次
    • 执行指令 访存1次
    • 不考虑存入ACC
  • 优点: 简单, 指令执行阶段仅访问一次主存, 不需专门计算操作数的地址

  • 缺点: A的位数决定了该指令操作数的寻址范围, 操作数的地址不易修改

间接寻址

  • 指令的地址字段给出的形式地址不是操作数的真正地址, 而是操作数有效地址所在的存储单元的地址, 也就是操作数地址的地址, 即EA(A) = A

image-20250119222208821

  • 优点

    • 可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)
    • 便于编制程序(用间接寻址可以方便地完成子程序返回)
  • 缺点

    • 指令在执行阶段要多次访存(一次间址需两次访存, 多次寻址需根据存储字的最高位确定几次访存)

寄存器寻址

  • 在指令字中直接给出操作数所在的寄存器编号, 即EA = Ri, 其操作数在由Ri所指的寄存器内

image-20250119222217412

  • 优点: 指令在执行阶段不访问主存, 只访问寄存器, 指令字短且执行速度块, 支持向量/矩阵运算

  • 缺点: 寄存器价格贵, 计算机中寄存器个数有限

寄存器间接寻址

  • 寄存器Ri中给出的不是一个操作数, 而是操作数所在主存单元的地址, 即EA = (Ri)

image-20250119222222831

  • 特点: 与一般间接寻址相比速度更快, 但指令的执行阶段需要访问主存(因为操作数在主存中)

隐含寻址

  • 不是明显地给出操作数的地址, 而是在指令中隐含着操作数的地址

image-20250119222226555

  • 优点: 有利于缩短指令字长

  • 缺点: 需增加存储操作数或隐含地址的硬件

立即寻址

  • 形式地址A就是操作数本身, 又称为立即数, 一般采用补码形式. #表示立即寻址特征

  • 优点: 指令执行阶段不访问主存, 指令执行时间最短

  • 缺点: A的位数限制了立即数的范围

    • 如A的位数为n, 且立即数采用补码时, 可表示的数据范围为 -2n-1 ~ 2n-1 - 1

偏移寻址

区别在于偏移的"起点"不一样

基址寻址

  • 将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A, 而形成操作数的有效地址, 即EA = (BR) + A

    image-20250119222231892

  • 优点

    • 可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
    • 用户不必考虑自己的程序存于主存的哪一空间区域, 故有利于多道程序设计, 以及可用于编制浮动程序(整个程序在内存里的浮动)

拓展: 程序运行前, CPU将BR的值修改为该程序的起始地址

BR面向操作系统, 不允许用户或程序员更改

变址寻址

  • 有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和, 即EA = (IX) + A, 其中IX可为变址寄存器(专用), 也可用通用寄存器作为变址寄存器

image-20250119222236665

  • 作用

    image-20250119222241344

  • 基址&变址复合寻址

    image-20250119222245684

变址寄存器是面向用户的, 在程序执行过程中, 变址寄存器的内容可由用户改变(IX作为偏移量), 形式地址A不变(作为基地址)

相对寻址

  • 程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址, 即EA = (PC) + A, 其中A是相对于PC所指地址的位移量, 可正可负, 补码表示

    image-20250119222249732

  • 优点: 操作数的地址不是固定的, 它随着PC指的变化而变化, 并且与指令地址之间总是相差一个固定值, 因此便于程序浮动(一段代码在程序内部的浮动)

  • 作用

    image-20250119222253487

堆栈寻址

  • 操作数存放在堆栈中, 隐含使用堆栈指针(SP)作为操作数地址

    image-20250119222258209