8085微处理器中的堆栈读写


从堆栈读取

假设SP包含地址FC78H,我们想要从堆栈位置读取信息。在这种情况下,我们对读取地址小于SP中存在的内存地址的位置不感兴趣。这是因为8085将它们解释为无用的信息。例如,从内存位置FC75H读取无用信息毫无意义。

SP解释说,内存位置FC78H、FC79H、...、FFFFH都被8085解释为包含有用的信息。要从堆栈读取,8085微处理器指令集中使用的指令是POP。下面我们将详细讨论POP指令。

在8085指令集中,使用助记符POP,我们可以通过rp(即寄存器对,例如BC、DE、HL或AF)从堆栈顶部弹出2个字节。这里AF是由标志寄存器和累加器寄存器组成的寄存器对,也称为PSW(处理器状态字)。在PSW中,累加器是高位字节,标志寄存器是低位字节。

助记符,操作数
操作码(十六进制)
字节数
POP B
C1
1
POP D
D1
1
POP H
E1
1
POP PSW
F1
1

在上面提到的操作码中,2位用于表示寄存器对。2位可以有4种组合。因此,可以使用POP提及4个寄存器对。如前所述,它们是BC、DE、HL和AF或PSW。

请注意,在LXI指令中,我们可以使用4个可能的寄存器对,即BC、DE、HL和SP。因此,我们不能同时对同一指令使用SP和PSW。

rp代码
寄存器对
0 0
BC
0 1
DE
1 0
HL
1 1
SP或PSW,但不能同时使用两者。

让我们考虑以下示例,以便更好地理解指令的操作。

这里我们考虑指令POP D,它属于该类别。由于rp可以具有四个值中的任何一个,因此此类指令有四个操作码。它在内存中只占用1个字节。POP D是此类指令的一个示例。它是一个1字节指令。下面通过一个示例显示此指令执行的结果。


之前
之后
(BC)
AABBH
AABBH
(SP)
3FFEH
4000H
(3FFFH)
AAH
AAH
(3FFEH)
BBH
BBH
(DE)
任意值
AABBH


地址
十六进制代码
助记符
注释
2000
01
LXI B, AABBH
用AABBH初始化BC寄存器对
2001
BB

低位字节BBH
2002
AA

高位字节AAH
2003
31
LXI SP,4000H
用4000H初始化SP
2004
00

低位字节00H
2005
40

高位字节40H
2006
C5
PUSH B
在3FFFH处移动AAH,在3FFEH处移动BBH
2007
D1
POP D
弹出并用堆栈内容初始化DE寄存器对

针对此指令POP D执行的时序图如下所示:

总结:因此,此指令POP需要1个字节、3个机器周期(操作码获取、内存读取、内存读取)和10个T状态才能执行,如时序图所示。

写入堆栈

假设SP内容为FC7AH,我们想要将信息写入堆栈位置。在这种情况下,我们对写入地址等于或大于SP中存在的内存地址的位置不感兴趣。这是因为8085将它们解释为包含有用的信息,不应破坏!例如,在内存位置FD7AH覆盖和破坏有用的信息毫无意义。我们应该写入目前包含无用信息的位置,并使其变得有用。

要写入堆栈,8085微处理器指令集中使用的指令是PUSH。下面我们将详细讨论PUSH指令。

在8085指令集中,PUSH rp指令通过将其推入堆栈顶部上方的两个位置来存储寄存器对rp的内容。rp代表以下寄存器对之一。

rp = BC、DE、HL或PSW

由于rp可以具有四个值中的任何一个,因此此类指令有四个操作码。它在内存中只占用1个字节。

助记符,操作数
操作码(十六进制)
字节数
PUSH B
C5
1
PUSH D
D5
1
PUSH H
E5
1
PUSH PSW
F5
1

在上面提到的操作码中,2位用于表示寄存器对。2位可以有4种组合。因此,可以使用POP提及4个寄存器对。如前所述,它们是BC、DE、HL和AF或PSW。

请注意,在LXI指令中,我们可以使用4个可能的寄存器对,即BC、DE、HL和SP。因此,我们不能同时对同一指令使用SP和PSW。

rp代码
寄存器对
0 0
BC
0 1
DE
1 0
HL
1 1
SP或PSW,但不能同时使用两者。

让我们考虑PUSH B作为此类指令的示例。它是一个1字节指令。

下面通过一个示例显示此指令执行的结果。


之前
之后
(BC)
AABBH
AABBH
(SP)
4000H
3FFEH
(3FFFH)
任意值
AAH
(3FFEH)
任意值
BBH


地址
十六进制代码
助记符
注释
2000
01
LXI B, AABBH
用AABBH初始化BC寄存器对
2001
BB

低位字节BBH
2002
AA

高位字节AAH
2003
31
LXI SP,4000H
用4000H初始化SP
2004
00

低位字节00H
2005
40

高位字节40H
2006
C5
PUSH B
在3FFFH处移动AAH,在3FFEH处移动BBH

针对此指令PUSH B执行的时序图如下所示:

总结:因此,此指令PUSH B需要1个字节、3个机器周期(操作码获取、内存写入、内存写入)和12个T状态才能执行,如时序图所示。

更新于:2019年7月30日

1K+ 次查看

启动您的职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.