指令及其格式
機器指令是由1,0組成的特定的二進制數序列。
機器指令格式為:操作碼欄位 地址碼欄位。其中,操作碼欄位表示執行操作類型,地址碼欄位表示運算元的地址或運算元本身。一般的運算元有被運算元,運算元及操作結果三種類型。圖1為機器指令的例子。
指令助記符
為了便於書寫和閱讀,每條指令通常用3個或4個英文縮寫字母來表示。這種縮寫碼叫做指令助記符。圖2是典型的指令助記符。
指令符號說明
AH、AL、BH、BL、CH、CL、DH、DL:八位通用暫存器;
AX、BX、CX、DX、SP、BP、DI、SI:十六位通用暫存器;
SP: 堆疊指針;
IP:指令指針;
FLAGS:標誌暫存器;
DI、SI:目的和源變址暫存器;
CS、DS、SS、ES: 段暫存器;
SEG:段暫存器通用符號;
REG:通用暫存器組;
AC:AX或AL/AH(取決於運算元長度)
SRC:源運算元
DST:目的運算元
MEM:存儲器運算元
MEM/REG:存儲器或通用暫存器運算元
DATA:立即數,8位或16位
OPRD:運算元
n:8位立即數
nn:16位立即數
nnnn: 32位立即數
數據傳送指令
數據傳送類指令分為四種:通用數據傳送、累加器專用數據傳送、地址傳送和標誌傳送。
通用數據傳送指令
通用數據傳送指令包括最基本的傳送指令MOV,堆疊操作指令PUSH和POP,數據交換指令XCHG和查表指令XLAT。
1.基本的傳送指令MOV。指令一般形式為:MOV DST,SRC;指令功能: (位元組或字);指令執行後,源運算元不變,目標運算元發生變化且與源運算元相同。例如:指令 MOV AL,BL;若該指令執行前,AL=25H,BL=86H,則指令執行後,AL=BL=86H。
2.堆疊操作指令。在8086/8088系統中,無論壓入或彈出操作,都是以字為單位。
(1)入棧指令:指令格式:PUSH OPRD;指令功能:先修改SP-2→SP,然後把一個源運算元(1個字)傳送到由SP所指向的堆疊的頂部。
(2)出棧指令:指令格式:POP OPRD;指令功能:是先將棧頂的一個字彈出送往目的運算元,再修改SP+2→SP。
3.交換指令。指令格式:XCHG OPRD1,OPRD2;指令功能:把二個位元組或字的運算元相互交換。這二個運算元不能是立即數,也不能同時為存儲器運算元。
4.查表指令。指令格式:XLAT SRC_Table;位元組查錶轉換指令,根據表中元素的序號查出對應元素的內容,序號從0,1,2……..。預先(1)將表的首地址存入BX暫存器,(2)要查找元素序號存入AL,執行XLAT指令後,將指定序號對應的元素內容存於AL。
I/O數據傳送指令
I/O(輸入/輸出)指令完成累加器AL(AX)與I/O連線埠間的數據傳送功能。此類指令中,一個運算元為AX(16位)或AL(8位),另一個是I/O連線埠。I/O連線埠的地址範圍總共64K,0000H-FFFFH。
I/O連線埠地址的表示方式:(1)直接方式:若連線埠地址≤FFH,連線埠地址用立即數直接給出;(2)間接方式:若連線埠地址>FFH,需要將I/O連線埠地址存入DX中。用DX可定址100H-0FFFFH的連線埠。
1、連線埠輸入指令IN
指令一般格式:IN AC,PORT
指令功能:把1個位元組或1個字,由輸入連線埠傳送給AL或AX。又分以下幾種形式:
(1)直接方式:地址≤FFH
IN AL,n
IN AX,n (n為連線埠地址)
(2)間接方式:地址>FFH
IN AL,DX
IN AX,DX
2、連線埠輸出指令OUT
指令一般格式:OUT PORT,AC
指令功能:把AL(AX)中的1個位元組(字),傳送到某個輸出連線埠。
(1)直接方式:
OUT n,AL
OUT n,AX (n為連線埠地址)
(2)間接方式:
OUT DX,AL
OUT DX,AX
地址傳送指令
地址傳送指令有3條:
①取有效地址指令LEA。指令一般格式:LEA REG,MEM;指令功能:將源運算元的段內偏移地址傳送給目的運算元。
②地址指針裝入DS指令LDS。指令一般格式: LDS REG,MEM;指令功能:源運算元必須是記憶體運算元,把源運算元(記憶體中的雙字數據:32位邏輯地址)的高字部分(段基址)傳送給DS,低字部分(段內偏移地址)送指令規定的暫存器。
③地址指針裝入ES指令LES。指令一般格式:LES REG,MEM;指令功能:把源運算元(記憶體中的雙字數據)的高位字傳送給ES(16位段基址),低位字傳送給指令規定的16位暫存器中。
標誌傳送指令
8086/8088有四條標誌傳送指令。
1.標誌裝入AH指令。指令格式:LAHF;指令功能:把標誌暫存器的低8傳送給AH。這樣,相應的符號標誌SF、零標誌ZF、輔助進位標誌AF、奇偶標誌PF和進位標誌CF被傳送至AH的對應位。
2、 設定標誌指令。指令格式:SAHF;此指令功能與LAHF相反,是把AH內容傳給標誌暫存器FLAGS的低8位,高8位不受影響。
3、 標誌壓入堆疊指令。指令格式:PUSHF;PUSHF指令先修改堆疊指針,即SP-2→SP,把整個標誌暫存器內容壓入堆疊。指令本身的執行不影響標誌位。
4、 標誌彈出堆疊指令。指令格式:POPF;這條指令把當前堆疊指針所指的一個字,傳送給標誌暫存器,同時修改堆疊指針,即SP+2→SP。
算術運算指令
8086/8088提供加、減、乘、除四種基本的算術操作。運算元可是帶符號數的字或位元組,也可是不帶符號數的字或位元組。若是帶符號數,則用補碼錶示。8086/8088還提供了各種校正操作指令,可以進行BCD碼或ASCⅡ碼錶示的十進制數的算術運算。
二進制加減法指令
(1)不帶進位的加減法指令ADD和SUB。指令用於無符號或帶符號數的位元組或字的加減運算。指令格式及功能:
ADD 目標, 源;目標+ 源→目標
SUB 目標, 源;目標-源→目標
(2)帶進(借)位的加減法指令ADC及SBB。此類指令通常用來實現多位元組、多字的加/減運算。除了在加法運算時須在最低位加上進位位CF值,或在減法運算時在最低位減去借位CF值外,其它與ADD,SUB指令相同。指令格式及功能:
ADC 目標, 源;目標+源+CF→ 目標
SBB 目標, 源;目標-源-CF→目標
(3) 加法和減法的ASCII碼調整指令。對於加法調整,若為非壓縮BCD碼,使用指令AAA;若為壓縮BCD碼,使用指令DAA。對於減法調整,若為非壓縮BCD碼,使用指令AAS;若為壓縮BCD碼,使用指令DAS。
(4)加1/減1指令INC/DEC。指令格式及功能:
INC 目標 ;目標+1→目標
DEC 目標;目標-1→目標
指令位元組較短,運行速度快,主要用於在循環程式中修改地址指針或循環次數。INC及DEC指令運算結果不影響CF標誌,對其他標誌位的影響與加減法指令ADD、SUB相同。
(5)求補及比較指令NEG、CMP。求補NEG及比較CMP指令都屬於特殊的二進制減法運算。
指令格式及功能:NEG 目標 ;0-目標→目標
CMP 目標,源;目標-源→狀態標誌
二進制乘除法指令
(1)無符號數乘法指令:指令格式及功能:MUL SRC ;
(2)帶符號數乘法指令:指令格式及功能:IMUL SRC ;
(3) 無符號數除法指令:指令格式及功能:DIV SRC ;
(4)帶符號數除法指令:指令格式及功能:IDIV SRC ;
(5)轉換指令(符號擴展):CWB: 將AL的符號位擴展到AH中;CWD:將AX的符號位擴展到DX中;
邏輯與移位
為了處理位元組或字中各位信息,8086/8088提供了三種位處理指令:邏輯運算指令、移位類指令和循環移位類指令。
邏輯運算指令包括邏輯與、邏輯或、邏輯非、邏輯異或和邏輯測試。所有的指令都對其運算元按每一位進行邏輯操作;運算元可以是位元組或字。
①邏輯非指令NOT: 邏輯非指令主要用來使某數變反。指令格式及功能:NOT 目標;目標→目標;邏輯非指令不影響狀態標誌。
②邏輯與指令AND:指令格式及功能:AND 目標,源;目標 ∧源→目標和狀態標誌;指令對狀態標誌的影響:執行後將使CF、OF標誌復位;按結果影響PF、ZF、SF標誌;AF標誌不定。
③邏輯或指令OR :指令格式及功能:OR 目標,源;目標 ∨源→目標和狀態標誌;或指令對狀態標誌的影響與AND 指令相似。或操作常用來使目標運算元某位置位。
④邏輯異或指令XOR :此類指令對狀態標誌的影響也與AND指令相似。XOR指令可使目標運算元某些位取反。指令格式:XOR 目標,源。
⑤邏輯測試指令TEST :指令格式及功能:TEST 目標,源;目標 ∧源→目標和狀態標誌。指令的功能是將兩個運算元按位相與,但結果不送回目標,只影響狀態標誌,影響情況同AND指令。TEST指令常用來檢測運算元的某位是1還是0。