一个字节:8位
一个字:16位
【微操作、微命令、微指令、微程序】
一条指令的执行过程可以分解为若干更微小的基本操作,并称这种基本操作为微操作。
控制完成微操作的命令称为微命令。
能够产生一个或多个微命令的二进制编码就称为微指令。
通过将完成一条机器指令的一系列微指令存入存储器中,然后再按顺序依次读出执行,从而完成指令的功能。并称这些完成机器指令功能的一系列微指令构成的程序称为微程序。
一、指令系统设计
1.字指令(依据字的个数分)
(1)单字指令和双字指令
在要设计的CPU中,指令有两种格式:单字指令和双字指令两种(在这里规定一个字为二进制16位)。即有的指令只用一个字构成,而有的指令则需两字构成。
- 单字指令:该指令由一个字组成(一行)
- 双字指令:该指令由两个字组成(两行)
(2)bit0~bit7指令寻址方式字段
从指令表示上:bit3决定是单字指令还是双字指令。
从指令作用上:寻址方式决定是单字指令还是双字指令。
寄存器寻址和寄存器间接寻址的指令只需一个字即可构成;
而立即寻址、直接寻址、相对寻址和变址寻址则需要两个字,其中一个字用来表示操作码及寻址方式,另一个字表示立即数、直接地址或偏移量。
- 单字指令:
①寄存器寻址;
②寄存器间接寻址; - 双字指令:
③立即寻址;
④直接寻址;
⑤相对寻址;
⑥变址寻址。
例子:
单字指令:
若指定两个操作数的ADD加法指令的操作码字段为00000001,则指令:ADD AX,[ SI]是一条寄存器间接寻址的单字指令,它由16位二进制编码。00000001 10000110组成(1000表示AX是目的地址,0110表示[SI])。
双字指令:
若指令: ADD AX,[2000H]是一条直接寻址的双字指令,该指令由两个16位的字组成,一个为指令码字、一个为直接地址:
00000001 10001001 为指令操作码字
00100000 00000000 为直接地址字
2.操作数指令(依据操作数的个数分)
(1)双操作数指令
双操作数指令的指令操作码字前缀为0000。
- ADD AX,[ SI]
- ADD AX,[2000H]
(2)单操作数指令
单操作数指令的指令操作码字为0000 1110。
- INC [BX]
假如规定加1指令INC的操作码为00001110 0001,[BX]是0101,则其指令码为:00001110 00010101。 - INC [DI+1000H]
00001110 00011101 为指令操作码字
00010000 00000000 为偏移量字
(3)转移指令
转移指令的指令操作码字为0000 1111。
(4)无操作指令
无操作指令的指令码前缀是0000 1111 1111.
3.具体的指令
(1)双操作数指令
双操作数指令设置有:
传送指令(MOV)
与指令(AND)
减法指令(SUB)
带进位加法指令(ADC)
带进位减法指令(SBC)
比较指令(CMP)
乘法指令(MUL)
除法指令(DIV)
加法指令(ADD)
或指令(OR)
异或指令(XOR)
(2)单操作数指令
单操作数指令设置有:
调用子程序指令(CALL)
加1指令(INC)
减1指令(DEC)
压入堆栈指令(PUSH)
弹出堆栈指令(POP)
取反指令(NOT)
左移指令(SHL)
逻辑右移指令(SHR)
算术右移指令(SAR)
小循环左移指令(ROL)
小循环右移指令(ROR)
大循环左移指令(RCL)
大循环右移指令(RCR)
(3)转移指令
尽管这类指令也是单操作数指令,在这里单独列出。设置指令有:
无条件转移指令(JMP)
零转移指令(JZ)
非零转移指令(JNZ)
有进位转移指令(JC)
无进位转移指令(JNC)
大于转移指令(JG)
大于等于转移指令(JGE)
高于转移指令(JA)
高于等于转移指令(JAE)
显然,在上述条件转移中,JC、JNC、JA、JAE是用于无符号数;而JG、JGE则用于带符号数。
(4)无操作数指令
无操作数指令主要有:
子程序返回指令(RET)
中断返回指令(IRET)
空操作指令(NOP)
关中断指令(CLI)
开中断指令(STI)
软件中断指令(SWI)
十进制校正指令(DAA)
二、指令时序
1.概念
指令时序是用来控制程序怎么遵从时间有秩序地执行。
- 指令周期:
CPU从头到尾执行一条指令所用的时间称为指令周期。 - 机器周期(CPU周期或总线周期):
把CPU通过系统总线对内存的一次读或写称为一个机器周期。
指令周期可以分为三个阶段机器周期:取指令操作码(取指)、指令取操作数(取数)和执行指令(执行). - 时钟周期(节拍周期)
机器周期的进一步细分:
机器周期是由时钟激励完成的,不同的机器周期所需时钟周期数是不一样的。
PS:
若是一条无操作数指令,则不需要取操作数,CPU将直接进入执行周期。
若有操作数,不管是一个还是两个,则进入取操作数的周期。
2.时序控制方式
指令时序怎么设计和执行,就是时序控制方式。(将如何根据不同指令形成不同系列控制信号所采用的控制方式称为时序控制方式)
(1)同步控制
同步控制
指令执行或指令中每个控制信号都由事先确定的统一的时序信号进行统一控制。
- ①定长的机器周期,定长的指令周期
如每条指令都有3个机器周期,每个机器周期都有4个时钟周期。因此,每条指令的执行时间都是12个时钟周期。 - ②定长的机器周期,变长的指令周期
机器周期的长度(时钟周期)是固定不变的,而指令可以由一个二个、三个或更多个机器周期组成 - ③变长的机器周期,变长的指令周期
- ④折中方案
(2)异步控制
异步控制
当控制器发出某一操作控制信号后,等待执行部件完成操作后发回“回答”信号,再开始新的操作。
- 没有统一的时钟对信号进行同步
- 每条指令的指令周期可由多少不等的机器周期数组成
(3)联合控制
同步控制和异步控制相结合的方式。
- 大部分微操作序列安排在固定的机器周期中
- 对某些时间难以确定的操作则采用“应答”方式。
如:CPU访问存储器时,依靠其送来的“READY”信号作为读/写周期的结束。
PS:
8086CPU采用同步②(定长的机器周期,变长的指令周期)的方式,并在读/写内存或接口时,利用应答信号READY来决定机器周期的长短。
三、指令执行过程分析
从指令时序分析,我们可以把一条指令的执行分为三个大的步骤:取指令操作码、取操作数、执行指令。
1.取指令操作码(取指)
取指令操作码的过程就是从主存中将指令字取出并放在指令寄存器IR中。而且这一过程对所有的指令(不管是单字指令还是双字指令)都是一样的。
取指过程:
- PC→AR;首先将PC的内容送地址寄存器AR
- AR→AB,RD,PC+1→PC;将AR输出到系统总线上,作为主存地址,接着送出读控制信号RD,同时内部程序计数器加1
- MD→DB,DB→DR;第三步就是将从主存读出的指令字(即操作码)送到数据寄存器DR
- DR→IR;DR再将指令字送到指令寄存器IR中
2. 译码取操作数
(1)检测指令
检测是哪种操作指令:双操作数指令、单操作数指令、转移指令和无操作数指令。
(2)转移指令
(3)双操作数指令
(4)单操作数指令
3.指令执行
四、微指令控制域
微指令控制域编码是构成微指令重要的组成部分。微指令在执行时,就是由该控制域的编码产生微命令。
通常,将微指令分为水平型微指令和垂直型微指令。
- 水平型微指令可以使多个控制信号同时有效,达到使多个微操作同时发生的效果。(一条微指令定义和执行多个并行微命令)
- 垂直型微指令类似于机器指令,它利用微操作码的不同编码来表示不同的微操作功能。(一条微指令只实现1~2个微命令。)
1.水平微指令
(1)直接表示法
表示方式:
- 在微指令的控制域字段中,直接表示法就是直接用一个二进制位表示一种微命令。微命令有多少个,控制字段就有多少位。
- 当某位设定为“1”时,表示该位定义的控制信号有效,为“0”时,表示该位定义的控制信号无效。这样,我们就可以利用一条微指令,同时使多个控制信号有效。
优点:
由于控制信号直接从微指令控制域的某位获得,不需要译码器(这种设计法也称作不译码法或直接控制法)。可以快速地产生控制信号。
缺点:
- 微指令控制字段很长:若计算机系统需要 n 个控制信号,则控制域字段长度为 n 个二进制位。
- 利用率是非常低的:机器指令执行过程的每一步,只需少量的几个微命令。因此,每一条微指令的控制字段中只有少数几个 1,绝大多数位都是 0(该位无效)。
(2)字段译码法(字段编码)
相容信号与互斥信号:
- 相容信号:可以同时出现。
- 互斥信号:不可以同时出现。
【互斥信号为什么不可以同时出现?】
凡是有可能使状态引起竞争的控制信号都是互斥的:
① 总线竞争:所有向内总线 IB 的输出信号必是互斥的。例如,PCout、BXout 等等。这些信号一旦同时出现,必定引起总线竞争,一定会造成严重后果。
② 多功能器件的诸多功能必是互斥的。例如,ALU 某一时刻只能完成一种功能,做加法时不可能同时做减法。移位器件不可能同时进行左移和右移。
③ CPU 对系统总线的操作是互斥的。CPU 不可能同时进行读写,读时不能写,写时不能读。
④ 同一器件的输入和输出是互斥的。例如,BXin,BXout 是互斥的。
字段编码法:它将控制域分为若干字段,互斥的信号放在同一字段、相容的信号放在不同字段。
- 直接译码方式:若各字段的编码相互独立,则通过各字段独立译码就可以获得计算机系统的全部控制信号
- 间接译码方式:若某些字段的编码相互关联,则关联字段要通过两级译码才能获得相关的控制信号
【为什么互斥的信号放在同一字段、相容的信号放在不同字段?】
同一字段只会同时执行一个信号,那么互斥的只有一个;不同字段可以同时执行多个信号,那么可以相容。
【字段编码法如何生效多个字段的指令,如何不生效某个字段的指令?】
在每个字段中设计一个无效控制信号NOP的编码来不生效某个字段的指令。控制域的某字段有 m 位,则可以提供
2
m
−
1
2^m-1
2m−1个控制信号的编码。
【一种字段编码法的控制域字段】
① 输出到内总线的命令
XXout微命令,它们是命令某个寄存器将其内容输出到内总线IB上。
它们放在一个用 4bit 编码的字段中,若从 0000 到 1011 的编码顺序表示从 NOP 到 Tout,则 PCout微命令必为 1001。该命令即可完成 PC→IB 微操作。
② 触发寄存器的命令
XXin微命令,它们是命令内总线IB上的内容输出到某个寄存器上。
这些命令用这 4 位编码来表示。同样,若从 0000 到 1100 的编码顺序表示从 NOP 到 Tin,则 PCin微命令
必为 1001。该命令即可完成 IB→PC 微操作。
③ 其他微命令
根据信号的多少决定该字段编码的位数。例如,ARin的编码应为二进制 10。
共27位。
2.垂直型微指令
例子:
如果 CPU 执行机器指令只需 50 余种微命令,则可用 6 位二进制编码构成微指令的控制字段。因为,一种编码只指定一种微命令,6 位编码有 64 种,足以表示这 50 几种微操作命令。可以想像其构成的微指令一定是很短的。
3.比较
五、微指令的设计
1.设计
共9+4+27=40位。
- NA:若控制存储器的容量为 512 字,微指令采用一地址格式,则地址编码用 9 位即可表示。
- 后继地址控制字段 AC:设定为 4 位,4 位 AC 编码用于控制顺序执行、无条件转移、两分支转移和多分支转移。
- 控制域字段:采用水平型编码的字段编码法
【XXout和XXin到底怎么区分?】 - XXout表示将XX中的数据放到IB内部总线上(取出XX)或者从相应器件(ALU)取出
- XXin表示将IB内部总线上的数据放到XX中(输入XX)或者向相应器件(ALU)输入
2.例子
表示PCout,ARin
六、微操作和微命令
1.微操作和微命令
微指令是一串微命令的结合。
微操作和微命令互相转化(其实就是微操作和微指令的互相转化)。
我们规定一个机器周期由 4 个节拍来实现。
(1)取指令码周期(取指)FIC
微操作 取指过程:
- PC→AR;首先将PC的内容送地址寄存器AR
- AR→AB,RD,PC+1→PC;将AR输出到系统总线上,作为主存地址,接着送出读控制信号RD,同时内部程序计数器加1
- MD→DB,DB→DR;第三步就是将从主存读出的指令字(即操作码)送到数据寄存器DR
- DR→IR;DR再将指令字送到指令寄存器IR中
对应的取指的微操作命令:
- W0 PCout,ARin
- W1 AR→AB,RD,PC+1
- W2 MD→DB,DRin
- W3 DRout,IRin
(2)取操作数周期(取数)FDC
① MOV AX, 4000H
该指令的取操作数周期过程如下:
W0 PCout,ARin
W1 AR→AB,RD,PC+1
W2 MD→DB,DRin
W3 DRout,AXin
这里要说明的是,该指令取操作数周期结束,该指令执行也就结束。利用最后的节拍启动下一条指令的 FIC 周期。
② ADD BX, [DI]
该指令的取操作数周期过程如下:
W0 DIout,ARin
W1 AR→AB,RD
W2 MD→DB,DRin
W3 DRout,Sin
在此取操作数的周期结束时,就将以 DI 的内容为内存地址的存储器单元的内容读出并放在暂存器 S 中,其输出加到了 ALU 的一边,接着就进行下一步执行周期EXEC。
③ 转移指令
在这里写出无条件转移和满足条件的条件转移的取操作数微操作命令安排。不
满足条件顺序执行前面己经提到,这里不再说明。
W0 PCout,ARin
W1 AR→AB,RD,PC+1
W2 MD→DB,DRin
W3 DRout,Sin
将指令操作数即偏移地址取出放入暂存器 S。
④ INC [BX]
该指令的取操作数周期过程如下:
W0 BXout,ARin
W1 AR→AB,RD
W2 MD→DB,DRin
W3 DRout,Sin
在此取操作数的周期结束时,就将以 BX 的内容为内存地址的存储器单元的内容读出并放在暂存器 S 中,其输出加到了 ALU 的一边,接着就启动下一步执行周期EXEC。
⑤ SHR CX
该指令的取操作数周期过程如下:
W0
W1
W2
W3 CXout,Sin
(3)执行周期(执行)EXEC
① MOV AX, 4000H
该指令取指令操作数与执行周期合在一起,前面己经说明。
② ADD BX, [DI]
该指令的执行周期过程如下:
W0 S→ALU
W1 BXout→ALU
W2 ALU,ADD→T,Tin
W3 Tout,BXin
在此周期里,ALU 将放在 S 中的操作数与 BX 的内容相加送 T,T 输出放回 BX中。
③ 转移指令
在这里写出无条件转移和满足条件的条件转移的执行周期微操作命令安排。
W0 S→ALU,
W1 PCout→ALU
W2 ALU,ADD→T,Tin
W3 Tout,PCin
将 PC 的当前值与偏移地址相加,构成目的地址放 PC。
④ INC [BX]
该指令的执行周期过程如下:
W0 S→ALU
W1 ALU+1→T,Tin
W2 Tout,DRin
W3 DR→DB,WR
在此周期中,将上面周期取得的操作数经 ALU 加 1,再送到数据寄存器 DR 中。此时,AR 中仍存有操作数的地址,送时就将 DR 出的数据写回原来的地址,
⑤ SHR CX
该指令的执行周期过程如下:
W0 S→ALU
W1 ALU 直通→T,Tin
W2 T 逻揖右移一次
W3 Tout,CXin
⑥ IRET
中断返回指令由取指周期直接进入执行周期,其过程为:
W0 SPout,ARin
W1 AR→AB,RD,SP+1
W2 MD→DB,DRin
W3 DRout,PCin
⑦ 中断响应过程 INTA
对中断请求响应时,CPU 仅保护 PC 的内容,并且由硬件提供该中断的中断向量。其过程为:
W0 SPout,ARin
W1 AR→AB,SP-1
W2 PCout,DRin
W3 DR→DB,WR
W0 0→IF,IFin
W1
W2
W3 IVout,PCin
中断响应过程需两个机器周期,第 1 个机器周期保护断点 PC 的内容入堆栈。第 2 个机器周期关中断(使 IF=0),并将特定的该中断的中断向量 IV 放入 PC,并启动取指周期。则下一个机器周期 CPU 必定进入该中断的中断处理程序入口开始执行。
六、例题
1.搞清问题
【问的是什么?微操作流程还是微流程】
实现指令 ADD AX, BX(功能为(AX)+(BX)→AX )
- 微操作流程:
PC→AR
AR→AB,RD,PC+1
DB→DR
DR→IR
AX→S
BX→IB,ADD
ALU→T
T→AX - 微流程:
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
⑤ BXout,ARin
⑥ AR→AB,RD
⑦ MD→DB,DRin
⑧ DRout,Sin
⑨ S→ALU
⑩ AXout→ALU
11.ADD→T,Tin
12.Tout,AXin
【问的是哪些阶段?是所有阶段还是只写指令执行阶段】
2.例题
(1)ADD指令
将源操作数放入S中,再由S输入到ALU中
将目的操作数直接输入到ALU中
ADD AX, [BX]
(取指)
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
(将[BX]对应的储存器中的数取出,放到S中)
⑤ BXout,ARin
⑥ AR→AB,RD
⑦ MD→DB,DRin
⑧ DRout,Sin
⑨ S→ALU
(将AX中的数取出,放到S中)
⑩ AXout→ALU
(两数相加,并将结果放入AX)
11.ADD→T,Tin
12.Tout,AXin
ADD BX, [DI]
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
⑤ DIout,ARin
⑥ AR→AB,RD
⑦ MD→DB,DRin
⑧ DRout,Sin
⑨ S→ALU
⑩ BXout→ALU
11 ADD→T,Tin
12 Tout,BXin
ADD AX,DISP(SI)
(取指)
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
(计算偏移地址)
⑤ PCout,ARin
⑥ AR→AB,RD,PC+1
⑦ MD→DB,DRin
⑧ DRout,Sin
⑨ S→ALU
⑩ SIout→ALU
11 ADD→T,Tin
12 Tout,ARin
(取内存中数)
13 AR→AB,RD,
14 MD→DB,DRin
15 DRout,Sin
16 S→ALU
(将AX中的数取出,放到S中)
16 AXout→ALU
(两数相加,并将结果放入AX)
17 ADD→T,Tin
18 Tout,AXin
(2)SUB BX,100(DI)
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
⑤ PCout,ARin
⑥ AR→AB,RD,PC+1
⑦ MD→DB,DRin
⑧ DRout,Sin
S→ALU
⑨ DIout→ALU
10 ADD→T,Tin
11 Tout,ARin
12 AR→AB,RD,
13 MD→DB,DRin
14 DRout,Sin
15 S→ALU
16 BXout→ALU
17 SUB→T,Tin
18 Tout,BXin
(3)INC指令
INC [BX]
① PCout,ARin
② AR→AB,RD,PC+1
③ MD→DB,DRin
④ DRout,IRin
⑤ BXout,ARin
⑥ AR→AB,RD
⑦ MD→DB,DRin
⑧ DRout,Sin
⑨ S→ALU
⑩ ALU+1→T,Tin
11 Tout,DRin
12 DR→DB,WR