彙編語言——指令系統

一種計算機所能執行的各種類型的指令的集合稱爲該計算機的指令系統。
Intel8086/8088CPU指令系統的指令可以分爲六大類:
  1.傳送類指令
  2.算術運算類指令
  3.位操作類指令
  5.程序轉移類指令
  6.處理器控制類指令

從指令的格式劃分,一般可以分爲三種:
  1.雙操作數指令:OPR DEST SRC
  2.單操作數指令:OPR DEST
  3.無操作數指令
對於無操作數指令,包含兩種情況:
  (1)指令不需要操作數,如暫停指令HLT。
  (2)在指令格式中,沒有顯式地指明操作數,但是它隱含指明瞭操作數的存放地方,如指令PUSHF。

1、傳送類指令

傳送類指令的作用是將數據信息或地址信息傳送到一個寄存器或存儲單元中,可以分爲以下四種情況:

1.通用數據傳送指令

指令格式:MOV DEST, SRC
作用:將源操作數指定的內容傳送到目的操作數,即DEST<=(SRC)。
當指令執行完後,目的操作數原有的內容被源操作數內容覆蓋,即目的操作數和源操作數具有相同內容。
MOV指令對標誌寄存器的各位無影響;
MOV指令可以是字節數據傳送也可以是字數據傳送,但是源操作數和目的操作數的長度必須一致。
MOV指令可以分爲以下幾種情況:

(1)立即數傳送到通用寄存器或存儲單元

例:
MOV AH, 10H
MOV AX, 2345H
MOV M-BYTE, 64H
MOV M-WORD, 2364H


注意:立即數只能作爲源操作數,立即數不能傳送給段寄存器。

(2)寄存器之間的傳送

例:
MOV AH, CH
MOV DS, AX
MOV ES, BX
MOV AX, CS
MOV CS, AX ; 錯誤


注意:段寄存器CS只能作源操作數,不能作目的操作數。

(3)寄存器與存儲單元之間傳送

例:
MOV AL, [SI]
MOV [DI], AH
MOV AX, 10[BX]
MOV TABLE[BP], BX
MOV DS, [SI][BX]


綜合,MOV指令在使用時需注意以下幾個問題:
立即數只能作爲源操作數,且它不能傳送給段寄存器。
段寄存器CS只能作源操作數,段寄存器之間不能直接傳送。
存儲單元之間不能直接傳送數據
MOV指令不影響標誌位

2.交換指令

指令格式:XCHG DEST, SRC
作用:源操作數和目的操作數兩者內容相互交換,即:(DEST)<=>(SRC).
指令對標誌寄存器各位無影響;
數據交換可以在寄存器之間或寄存器與存儲單元之間進行。但是不能在存儲單元之間進行數據交換。
寄存器只能使用通用寄存器。
例:
XCHG AX, BX
XCHG AH, CH
爲了完成兩個存儲單元(DA_BYTE1和DA_BYTE2)之間的數據交換可以使用以下三條指令來實現。
MOV AL, DA_BYTE1 ; AL <= (DA_BYTE1)
XCHG AL, DA_BYTE2 ; (AL) <=> (DA_BYTE2)
XCHG AL, DA_BYTE2 ; (AL) <=> (DA_BYTE2) 等價於 MOV DA_BYTE1, AL

3.標誌傳送指令

對標誌寄存器進行存取的指令有4條,它們都是無操作數指令,即指令隱含指定標誌寄存器、AH寄存器或堆棧寄存器爲操作數。

(1)取標誌寄存器指令

指令格式:LAHF
作用:將標誌寄存器的低8位送入AH寄存器,即將標誌SF、ZF、AF、PF、和CF分別送入AH的第7、6、4、2、0位,而AH的第5、3、1位不確定。
指令執行對標誌寄存器各位無影響,即標誌寄存器各位不變。

(2)存儲標誌寄存器指令

指令格式:SAHF
作用:將寄存器AH中的第7、6、4、2、0位分別送入標誌寄存器SF、ZF、AF、PF和CF各標誌位。而標誌寄存器高8位中的各標誌位不受影響。

(3)標誌進棧指令

指令格式:PUSHF
作用:先將堆棧指針SP減去2,使其指向堆棧頂部的空字單元,然後將16位標識寄存器的內容送SP指向的字單元。

(4)標誌出棧指令

指令格式:POPF
作用:將由SP指向的堆棧頂部的一個字單元的內容送入標誌寄存器,然後SP的內容加2.

4.地址傳送指令

這類指令有3條,它們的作用是將存儲單元的地址送寄存器。

(1)裝入有效地址

格式:LEA DEST, SRC
其中:源操作數SRC必須是一個字節或字存儲器操作數(地址),DEST必須是一個16位通用寄存器。
作用:將SRC存儲單元地址中的偏移量,即有效地址EA傳送到一個16位通用寄存器中。
指令執行對標誌寄存器各位無影響。
例:
LEA AX, [BX][SI]
源操作數使用的是基址變址尋址方式,它所形成的有效地址就是BX的內容加上SI的內容。即
AX <= (BX)+(SI)
注意:它不是將BX和SI所尋址的存儲單元的內容送入AX。

比較指令LEA BX, DS:[23H]與MOV BX, DS:[23H]的功能

(2)裝入地址指令指針

格式:LDS DEST, SRC
LES DEST, SRC
其中:DEST是任意一個16位通用寄存器。SRC必須是一個存儲器操作數。
作用:把SRC存儲單元開始的4字節單元的內容(32位地址指針)送入DEST通用寄存器和段寄存器DS(LDS)或ES(LES指令),其中低字單元內容爲偏移量送通用寄存器,高字單元內容爲段基值送DS或ES。
例:LDS SI, TABLE[BX]
設TABLE的值爲0A02H,(BX)=34H,(DS)=2030H

2、算術運算類指令

8086/8088指令系統中有加、減、乘、除指令,這些指令可以對字節數據或字數據進行運算。
參加運算的數可以是無符號數,也可以是帶符號數。帶符號數用補碼錶示。
參加運算的數可以是二進制數,也可以是十進制數(以BCD碼錶示)。

1.加法指令

指令格式:ADD DEST, SRC
功能:目的操作數和源操作數相加,其和存放到目的操作數中,而源操作數內容保持不變,即DEST <= (DEST)+(SRC)。
根據相加的結果將影響到標誌寄存器的CF、PF、AF、ZF、SF和OF。
DEST只能是通用寄存器或存儲器操作數。不能是立即數。
SRC可以是通用寄存器、存儲器或立即操作數
DEST和SRC不能都爲存儲器操作數。
ADD指令可以是字節操作數相加,也可以是字操作數相加。
例:分析下列各指令功能

(1)ADD AX, CX

功能:將寄存器AX的內容與CX的內容相加,結果傳送到AX中

(2)ADD AH, DATA_BYTE

功能:將由直接尋址方式所指示的存儲單元的內容與AH內容相加,結果送回AH中。

(3)ADD CX, 10H

功能:將常數10H加入到CX中。爲字操作數指令

(4)ADD AX, [BX][SI]

功能:將由基址變址尋址方式所指示的存儲單元的內容加入到AX中。

2.帶進位加法指令

指令格式:ADC DEST, SRC
該指令的功能與ADD基本相同,所不同的是其結果還要加上進位標誌位CF的值,即:
DEST <= (DEST)+(SRC)+CF
根據相加的結果設置標誌寄存器中的CF、PF、AF、ZF、SF和OF
注意:參加運算的進位CF是本條指令執行之前的值。
用ADC指令可以實現數據長度大於16位的兩數相加

例:計算12349678H + 377425H
MOV AX, 1234H
MOV BX, 9678H
ADD BX, 7425H
ADC AX, 37H

指令執行後,結果的高16位在AX,低16位在BX中。

3.加1指令

指令格式:INC DEST
該指令爲單操作數指令,其功能是將目的操作數加1,並送回到目的操作數,即:
DEST <= (DEST)+1
目的操作數可以是任意的8位、16位通用寄存器或存儲器操作數。目的操作數被視爲帶符號二進制數。
根據指令執行結果設置PF、AF、ZF、SF和OF標誌,但不影響CF。INC指令主要用於某些計數器的計數和修改地址指針。
例:
INC CL
INC SI
INC COUNT

4.減法指令

指令格式:SUB DEST, SRC
功能:目的操作數的內容減去源操作數的內容,結果送入目的操作數,源操作數中內容保持不變。即:
DEST <= (DEST)-(SRC)
操作結果將影響標誌位CF、PF、AF、ZF、SF和OF。
目的操作數DEST和源操作數SRC可以是8位或16位的通用寄存器、存儲器操作數,但兩者不能同時爲存儲器操作數。立即數只能作源操作數。

例:
SUB AX, BX
SUB AH, 10H
SUB DX, DA_WORD
SUB DA_BYTE, BL

注意:減法指令對借位標誌的影響,若採用變減爲加的運算方法,則產生的進位與CF標誌結果相反。

5.帶借位減法

指令格式:SBB DEST, SRC
該指令的功能與SUB指令基本相同,不同的是在兩個操作數相減後再減去進位標誌CF的值。即:
DEST <= (DEST)-(SRC)-CF.
注意:該CF的值是本條指令執行前的結果。
SBB指令在使用上與ADC類似,主要用於長度大於16位的數相減,即將低16位相減的結果引入高位部分的減法中。
根據指令執行結果設置PF、AF、ZF、SF、OF和CF。

6.減1指令

指令格式:DEC DEST
該指令爲單操作數指令,將目的操作數的內容減1後,送回到目的操作數。即:DEST<=(DEST)-1
DEST可以是8位16位的通用寄存器存儲器操作數,該指令將DEST看作是帶符號二進制數。
根據指令操作結果PF、AF、ZF、SF和OF,但不影響CF。
DEC指令的使用類似INC指令。主要用於計數和修改地址指針,計數方向與INC指令相反。
例:
MOV AL, 10H
DEC AL
JNC LOP

7.求負數指令

指令格式:NEG DEST
功能:用零減去目的操作數的內容,並送回目的操作數,即:DEST<=0-(DEST)
DEST可以是任意一個8位或16位的通用寄存器或存儲器操作數,被視爲帶符號的操作數。
由於機器中帶符號數用補碼錶示,求操作數的負數就是求補操作。因此,NEG指令也叫取補指令。
NEG指令將影響標誌PF、AF、ZF、SF、CF和OF。
對進位標誌CF的影響:
只有當操作數爲零時,進位標誌CF被置零,其它情況都被置1.
對溢出標誌OF的影響:
當字節操作數爲-128,或字操作數爲-32768時,執行NEG指令結果操作數將無變化,但溢出標誌OF被置1.

例:設AL中存放一個正數(AL)=25H,BL中存放一個負數(BL)=-58H,求它們的相反數,即負數。
    NEG AL
    NEG BL
指令執行後,(AL)=-25H=11011011B
          (BL)=58H=01011000B     

 

3、位操作類指令

1.邏輯運算指令

邏輯運算指令共有4條,它們的指令格式分別是:

與:    AND DEST, SRC
或:    OR DEST, SRC
異或:  XOR DEST, SRC
非:    NOT DEST

DEST和SRC可以是8位或16位的通用寄存器或存儲器操作數,但兩者不能同時爲存儲器操作數,SRC可以爲立即數。
邏輯指令對標誌位的影響:
NOT指令對標誌位無影響。而其餘三條指令將根據結果影響SF、ZF和PF,而CF和OF總是置0,AF爲不確定。
邏輯運算指令除用來實現各種邏輯運算之外,還常用於對字節或字數據的某些位的組合、分離或位設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章