8085 微处理器中的复位指令 (RSTn)
在 8085 指令集中,RSTn 实际上代表“Restart n”。在这种情况下,n 的值只能从 0 到 7。因此,存在八种可能的 RST 指令,例如 RST 0、RST 1、…、RST 7。它们是 1 字节的调用指令。在功能上,RST n 指令类似于
RST n = CALL n*8
例如,让我们考虑 RST 4 在功能上等效于 CALL 4*8,即 CALL 32 = CALL 0020H。RST 2 的优点在于它只有 1 字节长,而 CALL 0010H 则有 3 字节长。因此,RST 指令对于分支到常用子程序很有用。
助记符,操作数 | 操作码(十六进制) | 二进制 | 字节 | 目标地址 (n*8) |
---|---|---|---|---|
RST 0 | C7 | 1100 0111 | 1 | 0000H |
RST 1 | CF | 1100 1111 | 1 | 0008H |
RST 2 | D7 | 1101 0111 | 1 | 0010H |
RST 3 | DF | 1101 1111 | 1 | 0018H |
RST 4 | E7 | 1110 0111 | 1 | 0020H |
RST 5 | EF | 1110 1111 | 1 | 0028H |
RST 6 | F7 | 1111 0111 | 1 | 0030H |
RST 7 | FF | 1111 1111 | 1 | 0038H |
在上表中,已经表明,如果我们分析 RSTn 的十六进制代码,我们会发现中间的 3 位表示 n 的值(如表中突出显示的那样)。字节中的其他 5 位提供 RST 的代码。
让我们考虑 RST 4 作为此类指令的一个示例。它是一个 1 字节指令。它在功能上与 CALL 0020H = PUSH PC + JMP 0010H 相同。它导致分支到从内存地址 0020H 开始的子程序。类似地,RST 5 导致分支到 5*8 = 0028H 处的子程序。因此,从位置 0020H 开始的子程序不应超过内存位置 0027H。因此,最多只有 8 个位置可用于子程序,这通常太小,无法容纳子程序主体。此限制可以通过分支到其他内存位置(例如 4050H)处的子程序来克服。这是通过 RST 4 指令和内存位置 0020H 处的 JMP 4050H 指令的组合来实现的,如下面的图所示。
由于执行 RST 4 而导致堆栈内容受到影响的方式如下所示。
由于执行 RST 4 而导致堆栈内容受到影响的方式如下所示。
之前 | 之后 | |
---|---|---|
(PC) | 2021H | 0020H |
(SP) | 5000H | 4FFEH |
(4FFFH) | 任何值 | 20H |
(4FFEH) | 任何值 | 21H |
在图中,主程序从地址 2000H 开始,指令 LXI SP, 5000H 用于将 SP 初始化为该内存地址。主程序在地址 2050H 处具有终止指令 HLT。在主程序的地址 2020H 处,指令为 RST 4。因此,计算出的目标地址将为 4*8 = 32 = 0020H。因此,返回地址 2021H 将被推送到堆栈顶部。因此,20H 将被推送到堆栈位置 4FFFH,而 21H 将被推送到地址 4FFEH。因此,更新后的 SP 地址将为 4FFEH。并且控制将转移到地址 0020H。在该地址,我们有指令 JMP 4050H。因此,程序控制将分支到该地址 4050H。此子程序在地址 4080H 处具有最后一个指令,指令为 RET。因此,返回的 2 字节地址将从堆栈顶部弹出。因此,16 位返回地址将为 2021H,并且 SP 将再次初始化为 5000H。因此,主程序将恢复执行,并在地址 4080H 处使用指令 HLT 正常终止。
针对此指令 **RST 4** 执行的时间图如下所示:
**总结** - 因此,此指令 **RST 4** 需要 1 字节、3 个机器周期(操作码获取、内存写入、内存写入)和 12 个 T 状态才能执行,如时间图所示。