8085微處理器中的無條件呼叫和返回指令
有時在8085組合語言編碼中,我們需要多次重複某個程式段。在這種情況下,我們可以定義子程式。在這些子程式中,我們可以包含我們可重複使用的指令集或程式碼。然後,根據需要,我們將相應地呼叫這些子程式。子程式也可以稱為過程。
每當需要執行子程式中的指令時,我們使用**CALL**指令將程式控制分支到子程式。**CALL**是3位元組指令,其中1位元組用於操作碼,2位元組用於子程式的地址。**CALL**助記符代表“呼叫子程式”。執行子程式中編寫的指令後,我們將希望將控制返回到**CALL**指令之後編寫的下一條指令,然後我們將使用助記符**RET**。這裡**RET**代表從子程式返回。RET是1位元組指令。在下表中,我們提到了**CALL**和**RET**指令的程式碼和位元組數:
| 助記符,運算元 | 操作碼(十六進位制) | 位元組數 |
|---|---|---|
| CALL 標籤 | CD | 3 |
| RET | C9 | 1 |
讓我們考慮以下示例程式碼以更好地解釋:
| 地址 | 十六進位制程式碼 | 助記符 | 註釋 |
|---|---|---|---|
| 2000 | 31 | LXI SP, 5000H | SP ← 5000H. 初始化SP |
| 2001 | 00 | 地址的低位位元組 | |
| 2002 | 50 | 地址的高位位元組 | |
| 2003 | 3E | MVI A, 00H | A ← 00H,初始化累加器 |
| 2004 | 00 | 運算元為00H | |
| 2005 | 06 | MVI B, 01H | B ← 01H |
| 2006 | 01 | 運算元為01H | |
| 2007 | 0E | MVI C, 02H | C ← 02H |
| 2008 | 02 | 運算元為02H | |
| 2009 | 16 | MVI D, 03H | D ← 03H |
| 200A | 03 | 運算元為03H | |
| 200B | CD | CALL 2013H | 呼叫地址為2013H的子程式。因此,程式的控制將轉移到2013H位置。下一個指令的返回地址200EH(即下一條指令的地址)將被壓入堆疊頂部。結果,4FFFH(SP – 1)將包含20H,而4FFEH(SP – 2)將分別包含0EH。 |
| 200C | 13 | 地址的低位位元組 | |
| 200D | 20 | 地址的高位位元組 | |
| 200E | 21 | LXI H, 4050H | HL ← 4050H,初始化HL暫存器對。執行RET指令後,控制將返回到此指令。4050H將具有值06H,即01H + 02H + 03H = 06H的最終和 |
| 200F | 50 | 地址的低位位元組 | |
| 2010 | 40 | 地址的高位位元組 | |
| 2011 | 77 | MOV M, A | M ← A,累加器的內容將被傳輸到HL暫存器對指向的記憶體位置4050H |
| 2012 | 76 | HLT | 程式結束。 |
| 2013 | 80 | ADD B | A ← A + B |
| 2014 | 81 | ADD C | A ← A + C |
| 2015 | 82 | ADD D | A ← A + D |
| 2016 | C9 | RET | 將控制返回到地址200EH。返回地址200EH將從堆疊頂部彈出。因此,從地址4FFEH彈出0EH,從地址4FFFH彈出20H,SP將相應地將其內容恢復為初始地址5000H。 |
針對此指令**CALL 2013H**執行的時序圖如下:

**總結** − 因此,此指令**CALL**需要3個位元組、5個機器週期(操作碼提取、記憶體讀取、記憶體讀取、記憶體寫入、記憶體寫入)和18個T狀態才能執行,如時序圖所示。
針對此指令**RET**執行的時序圖如下:

**總結** − 因此,此指令**RET**需要1個位元組、3個機器週期(操作碼提取、記憶體讀取、記憶體讀取)和10個T狀態才能執行,如時序圖所示。
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP