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状态才能执行,如时序图所示。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP