很多人不理解stac指令和ldac指令的执行过程 梳理一下
LDAC指令的作用是:AC<—M[T] 即把rom中的内容送AC
STAC指令 同理 M[T]<—AC 把AC中的内容送T
首先需要明确的是各寄存器的功能 为了方便码字 CPU的图在最下
AR 地址寄存器 输出要执行的下一指令地址
TR 数据暂存器 处理双字节指令时使用 用来存储低八位的地址或数值
IR 指令寄存器 存储要执行的指令
AC 通用寄存器 存储第一个操作数
R 通用寄存器 用来存放第二个操作数
PC 程序计数器 输出当前执行的指令地址
DR 数据寄存器 存放双指令中低8位指向地址的存放值
其中LDAC指令包括三个部分 操作码 低位地址 高位地址
执行时必须从主存中取出地址然后再从相应的地址取数据到AC中
即1.取地址 2.根据相应地址取数据
其中取指令的周期即Fetch1 Fetch2 Fetch3:
Fetch 1.PC里存的地址送AR
Fetch2 ROM里的要执行指令的低八位送DR PC自动加一
Fetch3 DR里的指令送IR PC里指令的装载到AR
Fetch1 | AR<—PC |
Fetch2 | DR<—M,PC<—PC+1 |
Fetch3 | IR<—DR,AR<—PC |
在取指周期的Fetch2中 存储地址 T 的低 8 位已经放入 PC 中 并在 Fetch3 的时候 load 到 AR 中
所以此时CPU要做的事情是:
- PC+1 以便取下一条指令(在这里 是T的高8位地址)
- AR+1 取T的高8位地址 T //暂存器
即LDAC1 DR<—M PC<—PC+1 AR<—AR+1
接下来CPU可以取T的高8位地址了 同时它必须用数据暂存器TR暂存低8位地址 并且PC+1
即LDAC2 TR<—DR DR<—M PC<—PC+1
这时CPU得到了T的地址 可以进行从存储器读取数据的操作了 首先把地址复制到AR,然后把要去的数载入到DR 最后复制数据到AC中
LDAC3:AR<—DR,TR
LDAC4:DR<—M
LDAC5:AC<—DR
总的来说可以这么理解
Fetch2:T的低八位已经在PC
Fetch3:T的低八位load到AR中
LDAC1:DR<-M //取高八位 PC = PC+1 取下一条指令 AR = AR+1 取高八位地址
LDAC2: TR<-DR; //T的高八位地址得到 DR<-M PC<-PC+1 //取下一条指令
LDAC3: AR<—DR,TR //dr和tr把指令送ar ar得到十六位地址
LDAC4:DR<-M,DR<-AC
LDAC指令执行周期的数据流和控制流
节拍 | 状态 | 微操作序列(数据流) | 控制信号(控制流) |
T3 | LDAC1 | DR<—M,PC<—PC+1, AR<—AR+1 | read、membus、drload、pcinc、arinc |
T4 | LDAC2 | TR<—DR,DR<—M, PC<—PC+1 | trload、read、membus、drload、pcinc |
T5 | LDAC3 | AR<—DR,TR | drhbus、trbus、arload |
T6 | LDAC4 | DR<—M | read、membus、drload |
T7 | LDAC5 | AC<—DR | drlbus、acload、alus |
STAC指令执行周期的数据流和控制流
节拍 | 状态 | 微操作序列(数据流) | 控制信号(控制流) |
T3 | STAC1 | DR<—AC,AR<—AR+1, PC<—PC+1 | drload、read、membus、arinc、pcinc |
T4 | STAC2 | TR<—DR,DR<—M, PC<—PC+1 | read、membus、drload、trload、pcinc |
T5 | STAC3 | AR<—DR,TR | drhbus、trbus、arload |
T6 | STAC4 | DR<—AC | acbus、drload |
T7 | STAC5 | M<—DR | drlbus、busmem、clr、wirte |