‘DAD rp’ 指令执行
在 8085 指令集中,对于 16 位加法,有一个可用的指令,即 **DAD rp** 指令。它是一个 1 字节指令。使用此指令,将 HL 寄存器对的内容与所述寄存器对的内容相加,并将产生的结果存储在 HL 寄存器对中。
助记符,操作数 | 操作码(十六进制) | 字节数 |
---|---|---|
DAD B | 09 | 1 |
DAD D | 19 | 1 |
DAD H | 29 | 1 |
DAD SP | 39 | 1 |
例如,让我们考虑 DADB 指令的执行。假设 HL 寄存器对的初始内容为 5050H,BC 寄存器对的内容为 4050H。因此,如果我们执行指令 DAD B,则将进行以下 16 位加法:
之前 | 之后 | |
---|---|---|
(BC) | 4050H | 4050H |
(HL) | 5050H | 90A0H |
计算步骤 | (BC)= 4050H = 0100 0101 (HL)= 5050H = 0101 0101 ----- --------- (HL) 90A0H = 1001 1010 |
在第一个机器周期 M1 中,DAD B 指令的操作码 09H 从内存中取出到 8085 的 IR 寄存器。然后,8085 将解码此指令,将其解释为 DAD B 指令的操作码。此操作码提取机器周期总共需要 3 + 1 = 4 个时钟周期。现在是将 HL 和 BC 寄存器对的内容相加并将结果存储到 HL 寄存器对的时候了。在 8085 中,我们只有一个 8 位 ALU。因此,要执行此 16 位加法,我们使用临时寄存器来保存中间结果。
在第二个机器周期 M2 中,将发生以下操作。
累加器临时存储在 W 寄存器中;
L 寄存器内容移到累加器;
C 寄存器内容移到临时寄存器;
执行加法,并将 ALU 输出移到 L 寄存器。
此机器周期使用三个时钟周期。这是一个总线空闲 (BI) 机器周期,因为
8085 没有发出地址;
没有数据从外部发送或接收;
8085 没有产生外部控制信号。
在第三个机器周期 M3 中,将发生以下操作。
H 寄存器内容移到累加器;
B 寄存器内容移到临时寄存器;
执行带进位的加法,并将结果存储在 H 中;
累加器从 W 寄存器获取原始值。
此机器周期使用三个时钟周期。这也是一个总线空闲 (BI) 机器周期,因为
8085 没有发出地址;
没有数据从外部发送或接收;
8085 没有产生外部控制信号。
因此,DAD B 指令需要总共十个时钟周期。它由操作码提取机器周期(四个时钟周期)组成,后面跟着两个 BI 机器周期(每个三个时钟周期)。
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2000 | D3 | OUT F0H | 累加器内容将被发送到端口地址 F0H |
2001 | F0 | F0H 作为端口地址 |
针对此指令 **OUT F0H** 执行的时序图如下:
**总结** − 因此,此指令 **OUT** 需要 1 个字节,3 个机器周期(操作码提取、总线空闲周期、总线空闲周期)和 10 个 T 状态才能执行,如时序图所示。