type
date
slug
summary
tags
category
password
status
icon
一、指令系统
1、指令集体系结构
- 指令【机器指令】:指示计算机执行某种操作的命令,是计算机运行的最小功能单位
- 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码
- 指令集:一台计算机的所有指令集合构成该机的指令系统,也称为指令集
- 指令系统是指令集体系结构(ISA) 中最核心的部分
- ISA 规定的内容主要包括:
- 指令格式,指令寻址方式,操作类型,以及每种操作对应的操作数的相应规定
- 操作数的类型,操作数寻址方式,以及是按大端方式还是按小端方式存放
- 程序可访问的寄存器编号、个数和位数,存储空间的大小和编址方式
- 指令执行过程的控制方式等,包括程序计数器、条件码定义等
2、指令格式
(1)基本指令结构
- 一条指令通常要包括操作码字段和地址码字段
- 操作码:指出该指令应执行什么操作以及具有何种功能
- 地址码:给出被操作的信息(指令或数据)的地址
- 指令的地址由程序计数器给出

(2)指令的分类
- 按指令长度分类
- 单字长指令:指令长度 = 机器字长 【只需访存 1 次就能将指令完整取出】
- 双字长指令:指令长度 = 2 个机器字长 【访存 2 次才能完整取出,耗费 2 个存取周期】
- 半字长指令:指令长度 = 半个机器字长
指令字长指一条指令所包含的二进制代码的位数,其取决于操作码的长度、地址码的长度和地址码的个数
- 按是否定长分类
- 定长指令字结构:所有指令的长度都是相等的,执行速度快,控制简单
- 变长指令字结构:指令的长度随功能而异主存一般按字节编制,所以指令字长多为字节的整数倍
(3)具体指令结构
- 下图指令字长 32 位:
- 【操作码 (OP) 8 位】+【地址码 (A) 共 4 个,每个 6 位】
- 指令访问内存的过程:
- 首先 000000 这个位置上存放着操作指令
- $A_1$,$A_2$ 上存着两串数
- 他们在 000000 指令的执行下,要进行加法操作,将结果填入到 $A_3$ 中
- $A_3$ 中的数据就是 $A_1$ + $A_2$ 的和
- 最后再去 $A_4$ 读取出指令,开始下一轮工作
- 内存中既有操作码,又有地址码,这样把他们放在一起并不好可以优化他们
- 把操作码放一起,地址码放一块
- 通过程序计数器使操作码 +1 顺序执行
- 优化后的好处:
- 将操作码放一块,我们可以让程序执行完一步就自动执行下一句指令
- 这样我们的指令就不用存放下一条指令的位置了
- 这样访存的次数少了一次,速度也会快点
- 如无例外(如跳转指令),执行完就直接下一条继续,也就是顺序执行

(4)指令地址码
1)零地址指令
只给出操作码 OP,没有显示地址

- 不需要操作数的指令:空操作指令,停机指令,关中断指令
- 堆栈计算机,两个操作数来自堆栈的栈顶和次栈顶单元
2)一地址指令

- 只有目的操作数的单操作数指令:
- OP ($A_1$) -> $A_1$
- 自增、自减、取反、求补
- 若地址码字段均为主存地址,完成一条指令需要 3 次访存(取指 -> 读 $A_1$ -> 写 $A_1$)
- 隐含约定目的地址的双操作数指令
- (ACC) OP ($A_1$) -> ACC
- 另一个操作数由 ACC(累加器)提供
- 完成一条指令需要 2 次访存(取指 -> 读 $A_1$)
3)二地址指令

- ($A_1$) OP ($A_2$) -> $A_1$
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
- 完成一条指令需要 4 次访存(取指 -> 读 $A_1$ -> 读 $A_2$ -> 写 $A_1$)
4)三地址指令

- 常用于需要两个操作数的算术运算、逻辑运算相关指令
- ($A_1$) OP ($A_2$) -> $A_3$
- 完成一条指令需要 4 次访存(取指 -> 读 $A_1$ -> 读 $A_2$ -> 写 $A_3$)
5)四地址指令

- ($A_1$) OP ($A_2$) -> $A_3$,$A_4$ =下一条将要执行指令的地址
- 正常情况下:取指令之后 PC + 1,指向下一条指令
- 四地址指令:执行指令后,将 PC 的值修改为 $A_4$ 所指地址
- 完成一条指令需要 4 次访存(取指 -> 读 $A_1$ -> 读 $A_2$ -> 写 $A_3$)
(5)指令操作码
1)定长操作码
- 在指令字的最高部分分配固定的若干位(定长)表示操作码
- 一般取 n 位操作码字段的指令系统最大能表示 $2^n$ 条指令
- 优点:简化计算机硬件的设计,提高指令译码和识别速度
- 缺点:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限
2)可变长度操作码
- 全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上
- 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长
- 优点:在指令字长有限的前提下扔保持比较丰富的指令种类
- 缺点:增加了指令译码和分析的难度,使控制器的设计复杂化计算
- 指令字长为 16 位,每个地址码占 4 位:前 4 位为基本操作码字段 OP ,另有 3 个 4 位长的地址字段 $A_1$ 、$A_2$ 和 $A_3$
- 4 位基本操作码若全部用于三地址指令,则有 16 条,但至少须将 1111 留作扩展操作码之用,即三地址指令为 15 条
- 1111 1111 留作扩展操作码之用,二地址指令为 15 条
- 1111 1111 1111 留作扩展操作码之用,一地址指令为 15 条
- 零地址指令为 16 条设计原则

- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
- 各指令的操作码一定不能重复
总结
- 对使用频率较高的指令,分配较短的操作码
- 对使用频率较低的指令,分配较长的操作码
- 拓展操作码不一定只能有一条,也就是说不一定只有 1111 作拓展操作码
- 地址长度为 n,上一层留出 m 条指令,下一层可扩展出 $m×2^n$ 条指令
(6)指令操作类型
1)数据传送类
- 进行 CPU 和主存之间的数据传送
- LOAD:把存储器中的数据放到寄存器中
- 算术:加、减、乘、除、增1、减1、求补、浮点运算、十进制运算
- 逻辑:与、或、非、异或、位操作、位测试、位清除、位求反
- 改变程序执行的顺序
- 无条件转移 JMP、条件转移 BRANCH
- 调用 CALL、返回 RETURN、陷阱 Trap
- 调用指令和转移指令的区别:前者必须保存下一条指令的地址,当子程序执行结束时,根据返回地址返回到主程序继续执行,后者不需要返回
- 进行 CPU 和 I/O 设备之间的数据传送
- 传送控制命令和状态信息
二、指令的寻址方式
1、指令寻址
(1)概念
- 确定下一条要执行的指令的存放地址
- 由程序计数器 PC 指明
- 程序计数器是指让程序执行完一步就自动执行下一句指令的物理硬件
- 若机器按字寻址,PC 给出下一条指令字的访存地址 (指令在内存中的地址),因此 PC 的位数取决于存储器的字数
- 若机器按字寻址,指令寄存器 IR 用于接收取得的指令,因此 IR 的位数取决于指令字长
- “1” 理解为指令字长,实际加的值会因指令长度、编址方式而不同
- 现代计算机通常是按字节编址,若指令字长 16 位,(PC) + 2
- 跳跃寻址:通过转移类指令(如相对寻址)实现,可用来实现程序的条件或无条件转移
- 跳跃:指下条指令的地址不由 PC 自动给出,而由本条指令给出下条指令地址的计算方式
- 跳跃的方式分为绝对转移【地址码直接指出转移目标地址】和相对转移【地址码指出转移目的地址相对于当前 PC 值的偏移量】
- 跳跃的结果是当前指令修改 PC 值,下一条指令仍然通过 PC 给出,CPU 总是根据 PC 的内容去主存取指令

2、数据寻址
(1)概念
- 确定本条指令的地址码指明的真实地址
- 地址码 = 寻址特征 + 形式地址
- 寻址特征:指明属于那种寻址方式(其位数决定了寻址方式的种类)
- 形式地址 A:不代表操作数的真实地址,需要根据寻址特征的要求转换为对应存储器的地址
- 有效地址 EA:通过寻址方式和形式地址计算出操作数在存储器中的真实地址

- A 既可以是寄存器编号,又可以是内存地址,(A) 表示地址为 A 的数值
- EA=A 表示形式地址 A 就是真实地址 EA
- EA=(A) 表示形式地址 A 的内容就是真实地址 EA
(3)常见的数据寻址方式
访问主存空间的:
1)隐含寻址
- 定义:不直接给出操作数的地址,而是在指令中就隐含操作数的地址
- 寻址过程:
- 形式地址 A 取出对应的一个操作数
- 另一个操作数通过隐含寻址方式的指令设置,隐含在 ACC 中
- 有效地址:由程序指定*

- 优点:有利于缩短指令字长
- 定义:把我们实际要操作的数,直接存放在形式地址中
- 寻址过程:
- 寻址特征为#,代表立即寻址的意思
- 形式地址写的是操作数 3 的补码(011)
- 有效地址: A 就是操作数,也称立即数

- 优点:指令在执行阶段不访存,指令执行速度最快
- 缺点:A 的位数限制了立即数的范围
3)直接寻址
- 定义:地址字段给的是操作数的有效位置
- 寻址过程:根据这个有效位置去内存中寻找操作数
- 有效地址:EA = A

- 优点:简单,不需要专门计算操作数的地址,指令在执行阶段仅需访存 1 次
- 缺点:A 的位数限制了该指令操作数的寻址范围,操作数的地址不易修改
4)间接寻址
- 定义:地址字段给出的是,操作数有效地址所在主存单元的地址
- 寻址过程:去该主存单元取操作数的地址,再去找操作数
- 有效地址:EA = (A)

- 优点:可扩大寻址范围【EA 的位数大于 A 的位数】,便于编制程序【方便完成子程序的返回】
- 缺点:指令在执行阶段要多次访存(1 次间址 2 次访存),执行速度较慢
访问寄存器的:
5)寄存器寻址
- 定义:地址字段给出的是操作数所在寄存器的编号
- 寻址过程:访问该寄存器,取出操作数
- 有效地址:EA = $R_i$

- 优点:指令在执行阶段不用访存,只访问寄存器,执行速度快,指令字长较短【寄存器数量远小于内存单元数,地址码位数较少】
- 缺点:寄存器价格昂贵,CPU 的寄存器数量有限
6)寄存器间接寻址
- 定义:地址字段给出的是操作数所在的寄存器的地址
- 寻址过程:根据该地址去寄存器中找到操作数的有效地址
- 有效地址:EA = $(R_i)$

- 优点:相比间接寻址,既扩大了寻址范围,又减少了访存次数(执行阶段仅访存 1 次)
- 缺点:相比寄存器访存,执行阶段需要访存(操作数在主存中)
偏移寻址:
7)基址寻址
- 定义:CPU 中基址寄存器(BR)的内容 + 形式地址 A = 操作数的有效地址
- 寻址过程:程序运行前,CPU 将 BR 的值修改为程序的起始地址(存放在操作系统 PCB 中 )
- 有效地址:EA = (BR) + A
- 基址寄存器:
- 可采用专用寄存器,可指定某个通用寄存器
- 面向操作系统,内容由操作系统或管理程序确定,用于解决程序逻辑空间与存储器物理空间的无关性
- 程序执行过程中,基址寄存器内容不变(作为基地址),形式地址可变(作为偏移量)
- 采用通用寄存器时,可由用户决定哪个寄存器,但其内容仍由操作系统确定

- 优点:
- 可以扩大寻址范围(基址寄存器的位数大于 A 的位数)
- 用户不必考虑自己的程序存于主存的具体位置,有利于多道程序设计
- 可用于编制浮动程序
- 缺点:偏移量(A)的位数较短
8)变址寻址
- 定义:变址寄存器(IX)的内容 + 形式地址 A = 操作数的有效地址
- 有效地址:EA = (IX) + A
- 变址寄存器:
- 面向用户,程序执行过程中,内容可由用户改变(作为偏移量)
- 形式地址 A 不变(作为基地址)

- 优点:
- 可以扩大寻址范围(变址寄存器的位数大于 A 的位数)
- 在数组处理过程中,可设定 A 为数组的首地址,不断改变 IX 的内容,便可很容易形成数组中任意一个数据的地址,适合编制循环程序
- 偏移量的位数足以表示整个存储空间
9)相对寻址
- 定义:PC 的内容 + 形式地址 A = 操作数的有效地址
- 有效地址:EA = (PC) + A
- A 是相对于 PC 所指地址(下一条指令地址)的偏移量,可正可负,补码表示
- A 的位数决定操作数的寻址范围

- 优点:
- 操作数的地址不是固定的,随 PC 值的变化而变化,与指令地址之间总是相差一个固定的偏移量,因此便于程序浮动
- 广泛应用于转移指令
其他寻址:
10)堆栈寻址
- 定义:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址
- 堆栈:
- 存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)“原则管理的存储区
- 该存储区中被读 / 写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
- 硬件自动完成 SP 的加减操作
- 硬堆栈:寄存器堆栈,成本较高,不需要访存,不适合做大容量堆栈
- 软堆栈:从主存中划出一段区域,执行阶段访存 1 次
- 有效地址:入栈 / 出栈时 EA 的确定方式不同

(4)对比
- 速度方面:立即寻址 > 寄存器寻址 > 直接寻址 > 寄存器间接寻址 > 间接寻址

三、程序的机器级代码表示






四、CISC 和 RISC
1、复杂指令系统计算机(CISC)
- 设计思路:一条指令完成一个复杂的基本功能
- 代表:x86 架构,主要用于笔记本、台式机等
- 指令系统:复杂庞大
- 指令数目:一般大于 200 条
- 指令字长:不固定,指令格式多,寻址方式多
- 可访存指令:不加限制
- 各种指令执行时间:相差较大,大多数指令需要多个时钟周期才能完成
- 各种指令使用频度:相差很大
- 通用寄存器数量:较少
- 目标代码:难以用优化编译生成高效的目标代码程序
- 控制方式:绝大多数为微程序控制
- 指令流水线:可通过一定方式实现
- 兼容性:可兼容很多不同的高级语言和软件
2、精简指令系统计算机(RISC)
- 设计思路:一条指令完成一个基本“动作”,多条指令组合完成一个复杂的基本功能
- 代表:ARM 架构,主要永远手机、平板等
- 指令系统:简单精简
- 指令数目:一般小于 100 条
- 指令字长:定长,指令种类少,寻址方式种类少
- 可访存指令:只有 Load / Store 指令
- 各种指令执行时间:绝大多数在一个周期内完成
- 各种指令使用频度:都比较常用
- 通用寄存器数量:多
- 目标代码:采用优化的编译程序,生成代码较为高效
- 控制方式:绝大多数为组合逻辑控制,硬布线
- 指令流水线:必须实现
- 兼容性:较差
和 CISC 相比,RISC 的优点体现在:
- RISC 更能充分利用 VLSI(超大规模集成电路)芯片的面积
- RISC 更能提高运算速度
- RISC 便于设计,可降低成本,提高可靠性
- RISC 有利于编译程序代码优化
- 作者:救赎之旅
- 链接:https://jiushuself.nyc.mn/article/eca76854-adb7-4a02-a0bb-f9cd183bf758
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。