微處理器 - 8086 指令集



8086 微處理器支援 8 種類型的指令:

  • 資料傳送指令
  • 算術指令
  • 位操作指令
  • 字串指令
  • 程式執行轉移指令(分支和迴圈指令)
  • 處理器控制指令
  • 迭代控制指令
  • 中斷指令

現在讓我們詳細討論這些指令集。

資料傳送指令

這些指令用於將資料從源運算元傳輸到目標運算元。以下是此組下的指令列表:

傳輸字的指令

  • MOV - 用於將位元組或字從提供的源複製到提供的目標。

  • PUSH - 用於將一個字壓入堆疊頂部。

  • POP - 用於將堆疊頂部的字彈出到提供的地址。

  • PUSHA - 用於將所有暫存器壓入堆疊。

  • POPA - 用於將堆疊中的字彈出到所有暫存器。

  • XCHG - 用於交換兩個位置的資料。

  • XLAT - 用於使用記憶體中的錶轉換 AL 中的位元組。

輸入和輸出埠傳輸指令

  • IN - 用於將提供的埠中的位元組或字讀入累加器。

  • OUT - 用於將累加器中的位元組或字傳送到提供的埠。

傳輸地址的指令

  • LEA - 用於將運算元的地址載入到提供的暫存器中。

  • LDS - 用於從記憶體載入 DS 暫存器和其他提供的暫存器。

  • LES - 用於從記憶體載入 ES 暫存器和其他提供的暫存器。

傳輸標誌暫存器的指令

  • LAHF - 用於將標誌暫存器的低位元組載入到 AH 中。

  • SAHF - 用於將 AH 暫存器儲存到標誌暫存器的低位元組。

  • PUSHF - 用於將標誌暫存器複製到堆疊頂部。

  • POPF - 用於將堆疊頂部的字複製到標誌暫存器。

算術指令

這些指令用於執行算術運算,如加法、減法、乘法、除法等。

以下是此組下的指令列表:

執行加法的指令

  • ADD - 用於將提供的位元組加到位元組/字加到字。

  • ADC - 用於帶進位的加法。

  • INC - 用於將提供的位元組/字加 1。

  • AAA - 用於在加法後調整 ASCII 碼。

  • DAA - 用於在加法/減法運算後調整十進位制數。

執行減法的指令

  • SUB - 用於從位元組減去位元組/從字減去字。

  • SBB - 用於執行帶借位的減法。

  • DEC - 用於將提供的位元組/字減 1。

  • NEG - 用於對提供的位元組/字的每一位取反並加 1/求 2 的補碼。

  • CMP - 用於比較 2 個提供的位元組/字。

  • AAS - 用於在減法後調整 ASCII 碼。

  • DAS - 用於在減法後調整十進位制數。

執行乘法的指令

  • MUL - 用於將無符號位元組乘以位元組/將無符號字乘以字。

  • IMUL - 用於將有符號位元組乘以位元組/將有符號字乘以字。

  • AAM - 用於在乘法後調整 ASCII 碼。

執行除法的指令

  • DIV - 用於將無符號字除以位元組或將無符號雙字除以字。

  • IDIV - 用於將有符號字除以位元組或將有符號雙字除以字。

  • AAD - 用於在除法後調整 ASCII 碼。

  • CBW - 用於用低位元組的符號位的副本填充字的高位元組。

  • CWD - 用於用低字的符號位填充雙字的高字。

位操作指令

這些指令用於執行涉及資料位的操作,即邏輯、移位等操作。

以下是此組下的指令列表:

執行邏輯運算的指令

  • NOT - 用於反轉位元組或字的每一位。

  • AND - 用於將位元組/字中的每一位與另一個位元組/字中的對應位相加。

  • OR - 用於將位元組/字中的每一位與另一個位元組/字中的對應位相乘。

  • XOR - 用於對位元組/字中的每一位與另一個位元組/字中的對應位執行異或運算。

  • TEST - 用於將運算元相加以更新標誌,而不影響運算元。

執行移位運算的指令

  • SHL/SAL - 用於將位元組/字的位向左移動並將零 (S) 放入 LSB 中。

  • SHR - 用於將位元組/字的位向右移動並將零 (S) 放入 MSB 中。

  • SAR - 用於將位元組/字的位向右移動並將舊的 MSB 複製到新的 MSB 中。

執行旋轉運算的指令

  • ROL - 用於將位元組/字的位向左旋轉,即 MSB 到 LSB 和到進位標誌 [CF]。

  • ROR - 用於將位元組/字的位向右旋轉,即 LSB 到 MSB 和到進位標誌 [CF]。

  • RCR - 用於將位元組/字的位向右旋轉,即 LSB 到 CF 和 CF 到 MSB。

  • RCL - 用於將位元組/字的位向左旋轉,即 MSB 到 CF 和 CF 到 LSB。

字串指令

字串是一組位元組/字,它們的記憶體總是按順序分配。

以下是此組下的指令列表:

  • REP - 用於重複給定的指令,直到 CX ≠ 0。

  • REPE/REPZ - 用於重複給定的指令,直到 CX = 0 或零標誌 ZF = 1。

  • REPNE/REPNZ - 用於重複給定的指令,直到 CX = 0 或零標誌 ZF = 1。

  • MOVS/MOVSB/MOVSW - 用於將位元組/字從一個字串移動到另一個字串。

  • COMS/COMPSB/COMPSW - 用於比較兩個字串的位元組/字。

  • INS/INSB/INSW - 用作從 I/O 埠到提供的記憶體位置的輸入字串/位元組/字。

  • OUTS/OUTSB/OUTSW - 用作從提供的記憶體位置到 I/O 埠的輸出字串/位元組/字。

  • SCAS/SCASB/SCASW - 用於掃描字串並將其位元組與 AL 中的位元組或字串字與 AX 中的字進行比較。

  • LODS/LODSB/LODSW - 用於將字串位元組儲存到 AL 中或將字串字儲存到 AX 中。

程式執行轉移指令(分支和迴圈指令)

這些指令用於在執行過程中轉移/分支指令。它包括以下指令:

在執行過程中無條件轉移指令的指令:

  • CALL - 用於呼叫過程並將它們的返回地址儲存到堆疊。

  • RET - 用於從過程返回到主程式。

  • JMP - 用於跳轉到提供的地址以繼續執行下一條指令。

在執行過程中根據某些條件轉移指令的指令:

  • JA/JNBE - 如果滿足高於/不低於/等於指令,則跳轉。

  • JAE/JNB - 如果滿足高於/不低於指令,則跳轉。

  • JBE/JNA - 如果滿足低於/等於/不高於指令,則跳轉。

  • JC - 如果進位標誌 CF = 1,則跳轉。

  • JE/JZ - 如果等於/零標誌 ZF = 1,則跳轉。

  • JG/JNLE - 如果滿足大於/不小於/等於指令,則跳轉。

  • JGE/JNL - 如果滿足大於等於/不小於指令,則跳轉。

  • JL/JNGE - 如果滿足小於/不大於/等於指令,則跳轉。

  • JLE/JNG - 如果滿足小於等於/不高於指令,則跳轉。

  • JNC - 如果沒有進位標誌 (CF = 0),則跳轉。

  • JNE/JNZ - 如果不等於/零標誌 ZF = 0,則跳轉。

  • JNO - 如果沒有溢位標誌 OF = 0,則跳轉。

  • JNP/JPO - 如果沒有奇偶校驗/奇偶校驗奇數 PF = 0,則跳轉。

  • JNS - 如果沒有符號 SF = 0,則跳轉。

  • JO - 如果溢位標誌 OF = 1,則跳轉。

  • JP/JPE - 如果奇偶校驗/奇偶校驗偶數 PF = 1,則跳轉。

  • JS - 如果符號標誌 SF = 1,則跳轉。

處理器控制指令

這些指令用於透過設定/重置標誌值來控制處理器的動作。

以下是此組下的指令:

  • STC - 用於將進位標誌 CF 設定為 1。

  • CLC - 用於清除/重置進位標誌 CF 為 0。

  • CMC − 用於將進位標誌 CF 置為其補碼。

  • STD − 用於將方向標誌 DF 設定為 1

  • CLD − 用於清除/重置方向標誌 DF 為 0

  • STI − 用於將中斷允許標誌設定為 1,即啟用 INTR 輸入。

  • CLI − 用於將中斷允許標誌清除為 0,即停用 INTR 輸入。

迭代控制指令

這些指令用於執行給定指令多次。以下是此組下的指令列表:

  • LOOP − 用於迴圈執行一組指令,直到條件滿足,即 CX = 0

  • LOOPE/LOOPZ − 用於迴圈執行一組指令,直到滿足 ZF = 1 & CX = 0

  • LOOPNE/LOOPNZ − 用於迴圈執行一組指令,直到滿足 ZF = 0 & CX = 0

  • JCXZ − 如果 CX = 0,則跳轉到提供的地址

中斷指令

這些指令用於在程式執行期間呼叫中斷。

  • INT − 用於在執行期間中斷程式並呼叫指定的服務。

  • INTO − 如果 OF = 1,則用於在執行期間中斷程式

  • IRET − 用於從中斷服務返回到主程式

廣告