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