文章目录
第六章 指令系统
6.1 指令系统概述
6.1.1 指令系统
物理的计算机只能够执行机器语言程序,组成程序的每一条语句称作一条机器指令,一种计算机能够执行的机器指令的集合就是这种计算机的指令系统。
6.1.2 机器指令格式
指令的一般格式
操作码
操作码位数反映机器指令数目,内容反映机器做什么操作。
操作码类别:
- 长度固定,如 RISC 机器,指令规整,译码简单
- 长度可变,操作码分散在指令字的不同字段中,控制器设计复杂
地址码
地址码用来指定该指令操作数的地址、结果的地址,以及(可能有的)下一条指令的地址。
例如指令: MOV AX, [40],其中 “40” 指明了要操作的源操作数的地址,AX 指明了目的操作数的地址。
操作码扩展技术
通过操作码扩展(对应的地址码长度收缩)技术,能够有效地缩短指令的平均长度。
6.1.3 操作码设计举例
例题
假设一台计算机指令字长 16 位,操作码与地址码都为 4 位,请列出几种可能的操作码设计方法。
固定操作码
扩展操作码
扩展方案非常多,下面给出两种扩展方式。
6.1.3 指令字长
-
指令字长取决于操作码长度、地址码长度和地址码个数。指令按照字长是否可变分为两种:
- 指令字长固定: 指令字长 = 存储字长
- 指令字长可变: 按字节的倍数变化
-
指令字长可变,导致控制电路复杂,多字长指令需要多次访存,应尽量把常用指令设计为单字长或短字长指令。
6.2 操作类型
6.2.1 数据传送类指令
数据传送类指令主要分为 “源地址” 和 “目的地址” 两个部分。
- 寄存器-寄存器 MOV AX, BX
- 寄存器-存储器 MOV [20], AX(STORE指令)
- 存储器-寄存器 MOV AX, [20](LOAD指令)
- 存储器-存储器 MOV [20], [30]
- 堆栈操作: PUSH AX(入栈),POP AX(出栈)
- 清零、置1: MOV AX,0(清零),MOV AX,1(置1)
6.2.2 运算类指令
算术运算
加、减、乘、除、求补、浮点、十进制运算
- ADD AX, 20
- DIV AX, 3
逻辑运算
与、或、非、异或
- AND AX, 30
- XOR AX, 30
其他运算
位测试、位清楚、位求反
6.2.3 移位指令
一般来说,有 8 种移位指令:
算术左移、算术右移、逻辑左移、逻辑右移、小循环左移、小循环右移、大循环左移、大循环右移
6.2.4 转移指令
无条件转移指令
直接跳转到某处,不取决于任何条件。类似 C 中的 goto 语句,例如 JMP LOOP。
条件转移指令
根据机器当前的程序状态字中的某位来决定是否执行转移,例如 JZ LOOP。
JZ LOOP: 如果当前指令运算结果为0,则会跳转到 LOOP 标号处。
调用与返回指令
类比 C 程序中的函数调用,以及函数返回。例如 CALL PRO1、RET
子程序调用特点:
- 子程序可以在多处被调用
- 子程序调用可以嵌套
- CALL 与 RET 指令配对使用
- 要妥善保存子程序的返回地址
陷阱(TRAP)指令
- 一旦机器运行出现意外故障(未定义指令、除0、设备故障、电压不稳),计算机发出陷阱信号(陷阱隐指令),暂停当前指令的执行,转入故障处理程序。陷阱指令不提供给用户使用,由机器自动执行。
- 也有某些机器提供陷阱指令,例如 IBM-PC 提供的 INT xx 软中断指令,用来完成系统调用。
6.2.5 输入输出指令
对 I/O 单独编址对计算机,设置有专门的输入输出指令,用来操纵外设,如下所示。
- IN AX, [20](外设端口 CPU 的寄存器)
- OUT DX, AX(CPU 的寄存器 外设端口)
6.2.6 其他指令
- 停机指令、空操作指令、开中断指令、关中断指令、置条件码指令
- 字符串传送、字符串比较、字符串查询
- 特权指令(操作系统用)
- 向量指令
- 多处理机指令
6.3 数据寻址方式
数据寻址有多种,需要在指令中明确指出采用哪一种寻址方式,可以专门设置一个寻址方式特征字段,或纳入地址码中。
形式地址 A: 指令字中的地址
有效地址 EA: 操作数的真实地址
有效地址由形式地址根据寻址方式来确定。
在大多数机器中,指令字长 = 存储字长 = 机器字长。
6.3.1 立即寻址
又称为立即数寻址,即指令中的形式地址部分不是一个操作数的地址,而是操作数本身,因此该指令的执行过程不需要寻址。
如指令 “MOV AX, 20H”,将 20H 放入 AX 寄存器中,其中立即数可正可负,负数需要用补码来表示。
特点
- 立即寻址的指令执行阶段不访存
- A 的位数限制了立即数的范围
6.3.2 直接寻址
指令中的形式地址部分即为有效地址,即 EA = A。
例如指令 “MOV AX, [20H]”,即是将 [20H] 地址中的数据传输到 AX 寄存器中。
特点
- 执行阶段访问一次存储器
- A 的位数限制了该指令操作数的寻址范围
- 操作数的地址不易修改
6.3.3 隐含寻址
指令中不直接给出操作数地址,操作数地址通常隐含在操作码或某个(约定)寄存器中。
如 ADD 操作,即是默认另一个操作数在 ACC 中。将 A 地址中的数取出与 ACC 中的数进行加法运算。
6.3.4 间接寻址
指令中的形式地址不是操作数的地址,而是 “操作数地址的地址”。
其中在多次间址时,需要查看数据单元格中的第一位数据,如果为 1 则表示继续间址,如果为 0 则为真正地址。
特点
- 可以扩大寻址范围
- 便于编制转移程序
JMP @A 指令,表示跳转到 A 单元中所指示的地址,为间接寻址。正因为这条间址指令,我们转入子程序时只需修改 A 单元中数据,即可实现从子程序再跳转回主程序的功能。
6.3.5 寄存器寻址
指令中的形式地址直接指出寄存器的编号,操作数存储于寄存器中,即 ,有效地址即为寄存器编号。
如 “MOV AX, BX” 指令,即是将 BX 寄存器中的数据送到 AX 中。
特点
- 执行阶段不访存,只访问寄存器,执行速度快
- 寄存器个数有限,可缩短指令字长
6.3.6 寄存器间接寻址
指令中的形式地址为寄存器的编号,寄存器的内容是操作数的有效地址。
,有效地址在寄存器中。
如指令 “MOV AX, [BX]”,就是根据 BX 寄存器中的地址,去主存中访问对应数据,并将数据存入 AX 寄存器中。
特点
有效地址在寄存器中,操作数在存储器中,执行阶段访存便于编制循环程序。
- 可以访存一次,就将寄存器数值加1,实现类似于数组的访问。
6.3.7 基址寻址
指令中的形式地址与基址寄存器内容之和为有效地址。
- 采用专用寄存器作为基址寄存器(隐式)
- 采用通用寄存器作为基址寄存器(显式)
专用寄存器基地寻址
,其中 BR 为基址寄存器
通用寄存器基址寻址
需要给出寄存器编号作为基址寄存器。
- 可指定由哪个通用寄存器作为基址寄存器。
- 在程序的执行过程中 内容不变,形式地址 可变。
特点
- 可扩大寻址范围
- 有利于多道程序
- 将程序开头地址定位于某个寄存器中,即可实现更换通用寄存器,即实现程序切换。
- 基址寄存器内容由操作系统或管理程序确定
6.3.8 变址寻址
指令中的形式地址与变址寄存器内容之和为有效地址。
EA = (IX) + A,与基地寻址非常相似。唯一的不同点在于基址寄存器中的值由操作系统或管理程序决定,而 IX 的内容由用户指定。
特点
- 可以扩大寻址范围
- 由于 IX 的内容由用户指定,因此在程序执行过程中,IX 内容可变,可以用于设计处理一些数组问题。
6.3.9 相对寻址
有效地址为程序计数器 PC 的值与形式地址之和。
EA = (PC) + A,A 的位数决定操作数的寻址范围,可编写浮动程序(程序放哪都能执行)。
6.3.10 堆栈寻址
堆栈有两个操作,分别是 PUSH(压栈) 与 POP(弹栈)。进栈与出栈的操作分别由 SP 指针的加减完成。