8085微處理器中CALL和JUMP指令的區別
JMP指令和CALL指令之間的主要區別如下:
如果執行JMP指令,我們將跳轉到目標位置,並且執行從那裡繼續,而無需稍後返回到JMP之後的指令。另一方面,如果執行CALL指令,我們將跳轉到子程式,並且執行從那裡繼續,直到在子程式中執行RET指令,然後我們返回到主程式中CALL之後的指令。
CALL指令之後下一條指令的地址稱為返回地址。這是當8085執行RET指令時程式流程返回到的地址。在8085獲取call指令時,PC將遞增3,並將指向call之後的下一條指令。換句話說,在獲取call指令時,PC將具有返回地址。
為了促進這樣的返回,CALL指令首先將返回地址儲存在堆疊頂部之上。只有在那之後,分支到子程式才會發生。
我們在8085中擁有不同型別的條件和無條件JUMP指令。詳細資訊如下:
在8085指令集中,有一組跳轉指令,可以將程式控制轉移到某個記憶體位置。因此,在這些分支助記符之後,我們將必須提及該位置的16位目標地址。這些跳轉指令可以分為兩類:
無條件跳轉指令和
條件跳轉指令
在無條件跳轉指令下,只有一個助記符,即JUMP。但在條件跳轉指令下,我們有8個不同的助記符。我們知道8085標誌暫存器中有5個標誌位。它們是S、Z、P、Cy、AC。其中,只有在AC標誌位上,沒有跳轉指令。但對於其餘4個標誌位,我們有8個條件跳轉指令,具體取決於它們的值為1或0,即分別為TRUE和FALSE。以下是所有分支指令的列表,如下表所示:
| 助記符,運算元 | 操作碼(十六進位制) | 位元組數 |
|---|---|---|
| JC 標籤 | DA | 3 |
| JM 標籤 | FA | 3 |
| JMP 標籤 | C3 | 3 |
| JNC 標籤 | D2 | 3 |
| JNZ 標籤 | C2 | 3 |
| JP 標籤 | F2 | 3 |
| JPE 標籤 | EA | 3 |
| JPO 標籤 | E2 | 3 |
| JZ 標籤 | CA | 3 |
下表顯示了分支指令及其含義的列表。
| 操作碼 | 運算元 | 含義 | 解釋 | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| JMP | 16位地址 | 無條件跳轉 | 程式序列被轉移到運算元中給定的記憶體地址。 | |||||||||||||||||||||||||||
| 16位地址 | 條件跳轉 | 根據PSW的指定標誌,程式序列被轉移到運算元中給定的記憶體地址。 |
CALL指令的主要目的和用法如下:
有時在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,累加器的內容將被傳輸到記憶體位置4050H,因為它由HL暫存器對指向 |
| 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個位元組、5個機器週期(操作碼獲取、記憶體讀取、記憶體讀取)和10個T狀態才能執行,如時序圖所示。
.
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP