PS :

这是很久之前写的笔记了(就是有道课是学的。。。),可能是照着打下来的,但是不甘就放到草稿里,还是发出来吧。。。

知识点7: 指令格式与寻址

指令(又称机器指令)是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
一台计算机的所有指令的集合 构成 该机的 指令系统,也称为指令集。
指令系统是计算机的主要属性,位于硬件和软件的交界面上。

指令的基本格式:
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
一条指令通常要包括 操作码字段 和 地址码地段 两部分
操作码 指出 指令中该指令应该执行什么性质的操作 和 具有何种功能(逻辑运算、算数运算…)
地址码 用于 给出被操作的信息(指令或数据)的地址

指令的长度 是指 一条指令中所包含的 二进制代码的位数
指令字长 取决于 操作码的长度、操作数地址码的长度和操作数地址的个数
指令长度 等于 机器字长的 指令 称为 单字长指令
指令长度 等于 半个机器字长 的 指令 称为 半字长指令
指令长度 等于 两个机器字长 的 指令 称为 双字长指令
若所有指令的长度都是相等的, 称为 定长指令字结构
各种指令的长度随指令功能而异,就称为 变长指令字结构

根据指令中的操作数地址码的数目的不同,指令分为以下几种:
1.零地址指令: 只给出操作码OP,这种指令有两种可能
1) 不需要操作数的指令,如空操作指令、停机指令、关中断指令等
2) 零地址的运算类指令仅用在堆栈计算机中。
通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果在隐含地压入堆栈中。

2.一地址指令: 常见的有2中形态,根据操作码含义确定
1) 只有目的操作数的单操作数指令,按(A1)地址读取操作数,进行(OP)操作后,结果存回原地址。
指令含义: OP(A1) -> A1
2) 隐含约定目的地址的双操作数指令,按指令地址A1可读取 源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在ACC中
指令含义: (ACC)OP(A1) -> ACC
若 指令字长为32位,操作码占8位,1个地址码字段占24位,
则 指令操作数的直接寻址范围为 2的24方 = 16M

3.二地址指令: 对于常用的算术和逻辑运算指令,往往要求使用2个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次运算的结果
指令含义: (A1)OP(A2) -> A1
若 指令字长为32位,操作码占8位,2个地址码段各占12位,
则 指令操作数的直接寻址范围为 2的12次方 = 4K

4.三地址指令: OP A1 A2 A3(结果)
指令含义: (A1)OP(A2) -> A3
若 指令字长为32位,操作码占8位,3个地址码字段各占8位
则 指令操作数的直接寻址范围为 2的8次方 = 256
若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)

5.四地址指令: OP A1 A2 A3(结果) A4(下址)
指令含义: (A1)OP(A2) -> A3, A4 = 下一条将要执行的指令的地址
若 指令字长为32位,操作码占8位,4个地址码字段占6位,
则 指令操作数的直接寻址范围为 2的6次方 = 64

定长操作码指令是在指令字的最高位部分分配固定的若干位(定长)表示操作码。
一般n位操作码字段的指令系统最大能够表示 2的n次方 条指令
定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利

可变长度操作码,即全部 指令的操作码字段 的位数不固定,且分散地放在指令字的不同位置上。
可变长操作码方法 是扩展操作码,使操作码的长度随地址码的减少而增加
在设计扩展操作码指令格式时,必须注意一下两点:
1)不允许短码 是 长码 的前缀, 即 短操作码 不能与 长操作码 的前面部分的代码相同 (特别注意…)
2)各指令的操作码一定不能重复。
对使用频率较高的指令,分配较短的操作码
对使用频率较低的指令,分配较长的操作码

寻址方式 是指寻找指令或操作数有效地址的方式,也就是指确定本条指令的数据地址,以及下一条将要执行的指令地址的方法。
寻址方式 分为 指令寻址 和 数据寻址 两大类:
寻找下一条将要执行的指令地址 称为 指令寻址
寻找操作数的地址 称为 数据寻址
指令中的地址码字段并不代表操作数的真实地址,称为形式地址(A)。 用形式地址 并结合 寻址方式,可以计算出操作数在存储器中的真实地址,称为有效地址(EA)
(A)表示地址为A的数值,A既可以是 寄存器编号 也可以是 内存地址

指令寻址:
指令寻址有2中: 顺序寻址方式、跳跃寻址方式
1) 顺序寻址方式可通过程序计数器PC加1,自动形成下一条指令的地址
2) 跳跃寻址则通过 转移类指令实现
所谓跳跃,是指下一条指令的地址码不是由程序计数器默认产生,而是由本条指令给出下条指令地址的计算方式,跳跃的结果是当前指令修改PC值,所以下一条指令仍然是通过程序计数器PC给出。

数据寻址:
数据寻址就是如何在指令中表示一个操作数的地址,如何用这种表示得到操作数 或 怎样计算出操作数的地址。
数据寻址方式的种类较多,为了区别各种方式,通常在指令字中设一个字段(寻址特征),用来指明属于哪种寻址方式。
操作码 寻址特征 形式地址A
数据寻址的分类:
1.隐含寻址;
这种类型的指令,在指令中隐含着操作数的地址
单地址的指令格式,规定累加器ACC作为第二操作数地址
隐含寻址的优点是有利于缩短指令字长;
缺点是需要增加存储操作数或隐含地址的硬件(比如ACC嘛…)。

2.立即(数)寻址;
这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称为立即数。
数据是采用 补码 的形式存放的, #表示立即寻址特征,A就是操作数本身。
立即寻址的优点是 指令在执行阶段不访问主存,指令执行时间最短;
缺点是 A的位数限制了立即数的范围.
OP # A

3.直接寻址:
指令字中的形式地址A就是操作数的真实地址EA, 即 EA = A
直接寻址的优点是简单,指令在执行阶段仅访问内存一次,不需要专门计算操作数的地址
缺点是 A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改

4.间接寻址:
间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址 不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址(指针的指针…), 即EA = (A)
间接寻址可以使一次间接寻址,还可以是多次间接寻址

5.寄存器寻址:
在指令字中直接给出操作数所在的寄存器编号,其操作数在由Ri所指的寄存器内
寄存器寻址的优点是 指令在执行阶段不访问主存,只访问寄存器

6.寄存器间接寻址:
寄存器间接寻址 是指 寄存器Ri中给出的不是一个操作数,是操作数所在主存单元的地址。
寄存器间接寻址的特点是与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存。

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

8.基址寻址:
基址寻址是将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA = (BR) + A。 其中, 基址寄存器既可采用专用寄存器,也可采用通用寄存器。

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

10.堆栈寻址:
堆栈 是 存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为 堆栈指针(SP)。
堆栈 可分为硬堆栈与软堆栈两种。
寄存器堆栈又称为硬堆栈。寄存器堆栈的成本比较高,不适合做大容量的堆栈;
而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。
在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了SP。通常情况下,在读/写堆栈中的一个单元的前后都伴有自动完成对SP内容的增量或减量操作。

指令系统的发展方向:
一种是增强原有指令的功能,设置更为复杂的新指令,这类机器称为 复杂指令系统计算机(CISC)X86架构
一种是减少指令种类和简化指令功能,提高指令的执行速度,这类机器称为 精简指令系统计算机(RISC)ARM、MIPS架构。

CISC的主要特点:
1.指令系统复杂庞大,指令数目一般为200条以上
2.指令的长度不固定,指令格式多,寻址方式多
3.可以访存的指令不受限制
4.各种指令使用频度相差很大
5.各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
6.控制器大多数采用微程序控制
7.难以用优化编译生成高效的目标代码程序。

精简指令系统计算机(RISC)的中心思想是要求 指令系统简化,尽量使用寄存器–寄存器操作指令,指令格式力求一致。
RISC的主要特点:
1.选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
2.指令长度固定,指令格式种类少,寻址方式种类少
3.只有Load/Store(取数/存数)指令访存,其余指令的操作都是在寄存器之间进行
4.CPU中通用寄存器数量相当多
5.RISC 一定采用指令流水线技术,大部分指令在一个时钟周期内完成
6.以硬布线控制为主,不用或少用微程序控制
7.特别重视编译优化工作,以减少程序执行时间

知识点8: CPU结构与功能
中央处理器(CPU)由 运算器 和 控制器 组成。
控制器的功能 是负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令、执行指令
运算器的功能 是对数据进行加工

CPU的具体功能包括:
1) 指令控制: 完成取指令、分析指令、执行指令的操作, 即程序的顺序控制
2) 操作控制: 一条指令的功能往往是由 若干操作信号的组合 来实现的。
CPU管理并产生由 内存取出的每条指令的操作信号,把各个操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
3) 时间控制: 对各个操作加以时间上的控制。 时间控制要为每条指令按时间顺序提供应有的控制信号。
4) 数据加工: 对数据进行 算术和逻辑运算。
5) 中断处理: 对计算机运行过程中出现的异常情况和特殊请求进行处理

运算器接受从控制器送来的命令并执行相应的动作,对数据进行加工和处理。
他主要有算术逻辑单元(ALU)、暂存寄存器、累加寄存器(ACC)、通用寄存器、程序状态字寄存器(PSW)、移位器、计数器(CT)等组成。
(前4个 一定要有!!!)
1)算术逻辑单元: 主要功能是进行算术/逻辑运算
2)暂存寄存器: 用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。
暂存寄存器对应用程序员是透明的。
3)累加寄存器: 它是一个通用寄存器,用于暂时存放ALU运算结果信息,可以作为加法运算的一个输入端。
4)通用寄存器组: 如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数,目的操作数及中间结果)和 各种地址信息。 SP是堆栈指针,用于指示栈顶的地址。
5)程序状态字寄存器: 保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志(CF)等
6)移位器: 对操作数或运算结果 进行移位运算
7)计数器: 控制乘除运算的操作步数

控制器的基本功能就是 执行指令
每条指令的执行是由 控制器发出的一组微操作实现的。
控制器有 硬布线控制器 和 微程序控制器两种
控制器由 程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统、微操作信号发生器 等组成。
PC 即将执行的程序指令地址(地址)。 IR 正在执行的指令(数据)。 可以通过MAR、MDR计算出程序空间多大…
1)程序计数器: 用于指出下一条指令在主存中的存放地址。
CPU就是根据PC的内容去主存中取指令的。 因为程序中指令(通常)是顺序执行的,所以PC有自增功能。(是加一个单位,加多少个字节那要看情况!)
2)指令寄存器: 用于保存当前正在执行的那条指令。
3)指令译码器: 仅对操作码字段进行译码,向控制器提供特定的操作信号。
4)存储器地址寄存器: 用于存放所要访问的主存单元的地址。
5)存储器数据寄存器: 用于存放向主存写入的信息或从主存中读出的信息。
6)时序系统: 用于产生各种时序信号,它们都是由统一时钟(CLOCK)分频得到。
7)微操作信号发生器: 根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构由组合逻辑型和存储逻辑型2种

CPU从主存中每取出并执行一条指令所需的全部时间称为指令周期。
指令周期常常用若***器周期(取指令、取有效地址、执行指令)来表示,一个机器周期又包含若干时钟周期(也称为节拍或T周期)。每个指令周期内机器周期数可以不等

无条件转移指令JMPX,在执行时不需要访问主存,只包含取指阶段(包括取指和分析) 和 执行阶段,所以其指令周期 仅包含 取指周期和执行周期
对于间接寻址的指令,为了取操作数,需要先访问一次主存,取出有效地址,然后在访存,取出操作数,所以还需包括间址周期
当CPU采用中断方式实现主机和I/O设备交换信息时,CPU在每条指令执行结束前查询中断,如果有中断请求,CPU则进入中断响应阶段,又称中断周期。

指令周期 应该包括 : 取指、间址、执行、中断 4个周期
4个工作周期都有CPU访存操作,只是访存的目的不同。 取指周期 是为了 取指令,
间址周期 是为了 取有效地址
执行周期 是为了 取操作数
中断周期 是为了 保存程序断点。
为了区别不同的工作周期,在CPU内设置4个标志触发器FE、IND、EX、INT,分别对应 取指、间址、执行、中断周期,并以 “1” 状态表示有效,他们分别由 1->FE 1->IND 1->EX 1->INT这4个信号控制。