彙編8086CPU常用指令——詳解

數據傳送類指令

數據傳送是計算機中最基本、最重要的一種操作,數據傳送指令的功能是把數據從一個位置傳送到另一個位置。

1. 通用數據傳送指令

(1) MOV指令

  • 指令格式:MOV dest , src
  • 指令功能:dest←src

將數據由源位置傳送至目的位置,源操作數不變,不影響標誌位。

對操作數的規定:

  • src和dest的數據類型要一致
  • 類型一致的操作數之一必須有明確的類型,否則要用PTR指明類型。
  • 源操作數和目的操作數的尋址

(2) XCHG指令

  • 指令格式:XCHG reg , reg/mem
  • 指令功能:dest←src

將寄存器或存儲器中的內容與目的寄存器中的內容相互交換。不影響狀態標誌位。

對操作數的規定:

  • src和dest的數據類型要一致
  • 兩個存儲器操作數之間不能實現直接交換
  • 段寄存器和立即數不能作爲操作數

(3) XLAT指令

  • 指令格式:XLAT LABEL或 XLAT
  • 指令功能:AL←DS: [BX+AL]

用於將BX指定的緩衝區中,AL指定的位移處的數據取出傳送給AL 。
換碼指令(也叫查表指令)的兩種格式完全等效。操作數是隱含尋址,第一種格式中的LABEL表示首地址,第二種格式中的首地址隱含在BX中,位移在AL寄存器中。
在這裏插入圖片描述

2. 堆棧操作指令

堆棧操作:

  • 堆棧是一個“先進後出”的主存區域,位於堆棧段中;
  • 使用SS段寄存器存放段地址

有兩種基本的操作:

  • 數據壓進堆棧PUSH
  • 數據彈出堆棧操作POP

用SP指明當前棧頂。

  • 數據進入堆棧,SP減小
  • 數據彈出堆棧,SP增加

(1) 出棧指令POP :

  • 指令格式 POP r16/m16/seg
  • 指令功能:r16/m16/seg←SS: [SP],SP←SP+2

先將棧頂數據傳送到目的操作數(通用寄存器、存儲單元或段寄存器(CS除外)),然後堆棧指針SP加2。

(2) 進棧指令PUSH

  • 指令格式:PUSH r16/m16/seg
  • 指令功能:SP←SP-2,SS:[SP]←r16/m16/seg

先將SP減2作爲當前棧頂,然後將源操作數(立即數、通用寄存器和段寄存器內容或存儲器操作數)傳送到當前棧頂。

堆棧指令應用注意

  • 程序中有一個PUSH,必有一個對應的POP
  • 遵循先入後出原則
  • 按字或雙字進行操作
  • 出棧指令的操作數不能爲CS
  • 堆棧指令不影響標誌位

3. 標誌傳送指令

標誌位傳送指令專門用於對標誌寄存器(FR)的保護和更新操作。

(1) 標誌寄存器傳送

  • 讀標誌寄存器:LAHF

用於將FR的低字節(含SF、ZF、AF、PF和CF)讀出後傳送到AH寄存器。這條指令不影響標誌位。
在這裏插入圖片描述

  • 寫標誌寄存器:SAHF
    將寄存器AH中的內容寫入FR的低字節,取代某些標誌位(SF、ZF、AF、PF和CF)的原來狀態 。影響標誌位。
    在這裏插入圖片描述
  • 標誌寄存器入棧:PUSHF

將FR內容壓入堆棧,同時修改堆棧指針。 即: SP←SP-2 , SS:[SP]←FLAGS

  • 標誌寄存器出棧:POPF

將當前棧頂的一個字→ FR,同時修改堆棧指針。影響標誌位。即:FLAGS←SS:[SP] , SP←SP+2
在子程序調用或中斷子程序中,常用此保護和恢復需要的標誌位。

4. 地址傳送指令

地址傳送指令將存儲器的邏輯地址傳送至指定的寄存器。
(1)有效地址傳送指令

  • 指令格式 LEA r16 , mem
  • 指令功能 將存儲器操作數的有效偏移地址傳送至指定寄存器中。該指令不影響標誌位。

例如

MOV  BX , 0400H
 MOV  SI , 3CH
 LEA  BX , [BX+SI+0F62H]

執行結果:BX=139EH

(2)地址指針傳送指令

  • 指令格式 LDS r16 , mem 或 LES r16 , mem
  • 指令功能 將內存中mem指定的字送至r16,並將mem的下一字送DS或ES寄存器。不影響標誌位。
  • 應用 利用這兩條地址指針傳送指令可以對串操作源操作數和目的操作數的地址指針進行初始化。

5. 輸入輸出指令

輸入/輸出指令用於完成輸入/輸出端口與累加器(AL/AX)之間的數據傳送。
(1) 輸入指令IN

  • 指令格式 IN AL , i8;IN AX , i8;IN AL , DX;IN AX , DX
  • 指令功能 將字節數據(或字數據)通過指定端口傳送至累加器AL(或AX)中。不影響標誌位。

8086CPU用於尋址外設端口的地址線是16條,尋址前256個端口時,可用00H~0FFH直接尋址,尋址的端口號大於256時,只能用DX寄存器間接尋址。

(2) 輸出指令OUT

  • 指令格式 OUT i8 , AL;OUT i8 , AX;OUT DX , AL;OUT DX, AX
  • 指令功能 將字節數據(或字數據)通過累加器AL(或AX)傳送至指定端口中。不影響標誌位。

例 將數據80H送到3FCH端口。

MOV  DX , 3FCH
MOV  AL,80H
OUT   DX , AL

算術運算指令

算術運算指令可以完成帶符號和不帶符號的8位/16位二進制的算術運算,以及BCD碼錶示的十進制數的算術運算。

1. 加法指令

執行字或字節的加法運算。包括ADD,ADC和INC三條指令。

(1) 不帶進位加法指令ADD

  • 指令格式 ADD reg , imm/reg/mem 或 ADD mem , imm/reg
  • 指令功能 該指令將源操作數與目的操作數相加,結果送到目的操作數。該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

(2) 帶進位加法指令ADC

  • 指令格式 ADC reg , imm/reg/mem或 ADC mem , imm/reg
  • 指令功能 該指令將源操作數與目的操作數相加再與進位CF相加,結果送到目的操作數。該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

ADC指令主要用於與ADD指令相結合實現多字節數相加。

例 分析用ADC指令完成的無符號雙字長加法運算。

MOV  AX , 4652H 
ADD  AX , 0F0F0H 
MOV  DX , 0234H 
ADC  DX , 0F0F0H

執行結果:

AX=3742H    CF=1
DX=F325H     CF=0

(3) 增量指令INC

  • 指令格式 INC reg/mem
  • 指令功能 該指令將目的操作數的內容加1,並將結果回送到目的操作數。 該指令影響標誌位AF、PF、SF、OF和ZF,但不影響CF標誌。

2. 減法指令

執行字或字節的減法運算。包括SUB,SBB,DEC,NEG和CMP五條指令。

(1) 不帶借位減法指令SUB

  • 指令格式 SUB reg , imm/reg/mem 或SUB mem , imm/reg
  • 指令功能 該指令將目的操作數與源操作數相減,結果送到目的操作數。該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

(2) 帶借位減法指令SBB

  • 指令格式 SBB reg , imm/reg/mem 或SBB mem , imm/reg
  • 指令功能 該指令將目的操作數與源操作數相減再與借位CF相減,結果送到目的操作數。該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

SBB指令主要用於與SUB指令相結合實現多倍字長數相減。

例 分析用SBB指令完成的無符號雙字長減法運算。

MOV  AX , 4652H 
SUB  AX , 0F0F0H 
MOV  DX , 0234H 
SBB  DX , 0F0F0H 

執行結果:

AX=5562H    CF=1
DX=1143H   CF=1

(3) 減量指令DEC

  • 指令格式 DEC reg/mem
  • 指令功能 該指令將目的操作數的內容減1,並將結果回送到目的操作數。 該指令影響標誌位AF、PF、SF、OF和ZF,但不影響CF標誌。

(4) 求補指令NEG

  • 指令格式 NEG reg/mem
  • 指令功能 該指令將目的操作數求補運算,將其結果送回目的操作數。實際上是用零減去操作數,然後將結果返回操作數。 該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

例如

MOV  AX,0FF64H 
NEG  AX

結果

AX = 009CH
CF=1

(5) 比較指令CMP

  • 指令格式 CMP reg , imm/reg/mem或CMP mem , imm/reg
  • 指令功能 該指令將目的操作數減去源操作數,結果不回送。 該指令影響標誌位CF、AF、PF、SF、OF和ZF 。

3. 乘法指令

用來實現兩個二進制操作數的相乘運算 。包括無符號數乘法指令MUL和有符號數乘法指令IMUL兩條指令。
(1)無符號數乘法指令MUL

  • 指令格式 MUL R8/M8 或MUL R16/M16
  • 指令功能 (AX)←(AL)(SRC)或(DX,AX)←(AX)(SRC)

該指令實現兩個無符號數的乘法運算,其中被乘數隱含在AL(或AX)中,運算結果要保存在AX(或DX和AX)中。

邏輯運算類指令

邏輯運算類指令用來對字或字節按位進行邏輯運算,包括:邏輯與AND,邏輯或OR,邏輯非NOT,邏輯異或XOR和測試TEST五條指令。
1. 邏輯與指令

指令格式 AND dest,src
指令功能

  1. 按位進行邏輯與,結果返回目的操作數
  2. 設置CF=OF=0
  3. 影響SF,ZF和PF

2.邏輯或指令
指令格式 OR dest,src
指令功能

  1. 按位進行邏輯或,結果返回目的操作數.
  2. 設置CF=OF=0
  3. 影響SF,ZF和PF

3. 邏輯非指令
指令格式 NOT reg/mem
指令功能

  1. 按位進行邏輯非,結果返回目的操作數.
  2. 不影響標誌位

4. 邏輯異或指令
指令格式 XOR dest,src
指令功能

  1. 按位進行邏輯異或,結果返回目的操作數.
  2. 設置CF=OF=0
  3. 影響SF,ZF和PF

5. 邏輯測試指令
指令格式 TEST dest,src
指令功能

  1. 按位進行邏輯與,結果不返回目的操作數.
  2. 設置CF=OF=0
  3. 影響SF,ZF和PF

例 邏輯異或

MOV  AL , 45H
XOR  AL , 31H

執行結果:

AL= 74H,CF=OF=0,SF=0,ZF=0,PF=1

移位運算指令

這組指令可以對字節或字中的各位進行算術移位和邏輯移位。移位次數可以是1也可以大於1。若移位次數大於1時,必須將次數預先放入CL。

1. 非循環移位類指令

(1) 邏輯移位指令

  • SHL REG/MEM , 1/CL
  • SHR REG/MEM , 1/CL
    在這裏插入圖片描述
    (2) 算術移位指令
  • SAL REG/MEM , 1/CL
  • SAR REG/MEM , 1/CL
    在這裏插入圖片描述
    這組指令影響除AF以外的各個標誌位。
  • CF、SF、ZF、PF按移位結果設置。
  • 移位次數爲1時,按照目的操作數的最高位是否改變設置OF,改變時OF=1,否則爲0。

2. 循環移位類指令

(1) 不帶進位循環移位指令
-ROL REG/MEM , 1/CL
ROR REG/MEM , 1/CL
在這裏插入圖片描述
(2) 帶進位循環移位指令

  • RCL REG/MEM , 1/CL
  • RCR REG/MEM , 1/CL
  • 在這裏插入圖片描述
    這組指令不影響SF、ZF、PF、AF標誌位。
  • CF按移位結果設置。
  • 移位次數爲1時,按照目的操作數的最高位是否改變設置OF,改變時OF=1,否則爲0。

例1 利用位移指令計算DX←3×AX+7×BX,假設爲無符號數運算,沒有進位。
算法實現: DX←(2×AX+AX)+(8×BX-BX)

MOV  SI , AX 
SHL  SI , 1 
ADD  SI , AX 
MOV  DX , BX
MOV  CL , 03H
SHL  DX , CL
SUB  DX , BX
ADD  DX , SI

例2 對AL中的數據進行移位

MOV  CL , 4
MOV  AL , 0F0H
SHL   AL,1
SHR   AL,1
SAR   AL,1
SAR   AL,CL

執行結果:

AL= 03H,CF=1,SF=0,ZF=0,PF=1,OF不確定

程序控制類指令

  • 在80X86CPU中,程序的執行序列是由代碼段寄存器CS和指令指針IP確定的。
  • 程序控制類指令通過修改CS和IP寄存器的值來改變程序的執行順序,也是使用概率很高的指令。

1. 無條件轉移指令 JMP

  • 無條件轉移,就是不需要任何條件就能使程序改變執行順序。
  • CPU只要執行無條件轉移指令JMP,就可以使程序轉到指令的目標地址處,從目標地址處開始執行新的指令。

在8086CPU中,使用JMP指令可以將程序轉移到1MB存儲空間的任何位置。根據跳轉的距離,JMP指令分成了段內轉移和段間轉移。

  • 段內轉移是指在當前代碼段64KB範圍內轉移,因此不需要更改CS段地址,只需要改變IP偏移地址。
  • 段間轉移是指從當前代碼段跳轉到另一個代碼段,此時需要更改CS段地址和IP偏移地址,

JMP指令根據目標地址尋找方式的不同,可以分成四種格式。
(1)段內轉移,相對尋址

JMP  BABEL               ;IP←IP + 位移量
  • 位移量是指緊接着JMP指令後的那條指令的偏移地址到目標指令的偏移地址的地址位移
  • 當向地址增大方向轉移時,位移量爲正
  • 向地址減小方向轉移時,位移量爲負

(2)段內轉移,間接尋址

JMP  R16/M16             ;IP←R16/M16

這種形式的JMP指令,將一個16位寄存器或主存單元內容送入IP寄存器,作爲新的指令指針,但不修改CS寄存器的內容。即寄存器或主存單元內容爲轉移地址。可在64KB的範圍內轉移。

(3)段間轉移、直接尋址

  JMP  far ptr label           ;IP←label的偏移地址,CS←label的段地址

段間直接轉移指令,是將標號所在段的段地址作爲新的CS值,標號在該段內的偏移地址作爲新的IP值。

(4)段間轉移、間接尋址

  JMP  far ptr mem   ;IP←[mem],CS←[mem+2]
  • 轉移目標地址存放在主存中連續的兩個字單元中,其中低位字送IP寄存器,高位字送CS寄存器。
  • 段間轉移用於複雜的、具有多個代碼段的程序設計
  • Far pat代表遠程(段間),Near代表近程(段內)

段間轉移、間接尋址舉例:

MOV  AX,OFFSET  Label;獲取標號的偏移地址
MOV   [BX], AX
MOV  AX,SEG  Label;獲取標號的段地址 	
MOV  [BX+2],  AX
JMP  far ptr [BX]    ;轉移到標號Label指定的位置
偏移地址送IP;段地址送CS
段間轉移目標地址在實際程序中,一般都以標號形式給出。

2. 條件轉移指令

  • 條件轉移指令JCC(CC代表條件)用於分支程序設計,根據指令的條件確定程序是否發生轉移。

  • 如果滿足條件,則程序轉移到目標地址去執行程序;不滿足條件,則程序將順序執行下一條指令

      通用格式: JCC  label  
      			條件滿足,發生轉移:IP←IP + 8位位移量
                 否則,順序執行:IP←IP + 2
      條件轉移都是短轉移,轉移範圍是-128到127
    
  • 其中,label表示目標地址(8位位移量)

  • 與其他控制轉移指令一樣,條件轉移指令不影響標誌位,但它要利用標誌位。

  • 條件轉移指令共有16種,如表下表所示。表中斜線分隔了同一條指令的多個助記符形式 。即同一條指令可以有2到3種書寫方式。

  • 條件轉移指令跳轉的目標地址只能用段內相對短跳轉,即目標地址只能在同一段內,且相對當前IP地址-128~+127 個單元的範圍之內。
    在這裏插入圖片描述
    (1)通過判斷單個標誌位實現轉移

例:X和Y是存放於X單元和Y單元的16位操作數,計算X-Y的絕對值,結果存入指定的RESULT單元。利用符號標誌SF進行判斷,使用指令JS或JNS實現轉移。

	MOV  AX , X
	SUB   AX , Y      	;AX←X-Y,下面求絕對值
	JNS  NONNEG   	;結果爲正數,轉向保存結果
	NEG  AX         	;爲負數,進行求補得到絕對值
	NONNEG: MOV  RESULT , AX	;保存結果

例: X和Y爲存放於X單元和Y單元的16位有符號操作數,計算X-Y。利用OF標誌,判斷是否溢出,使用指令JO或JNO實現轉移

MOV  AX , X
SUB   AX , Y
JO    OVERFLOW  	;溢出轉移到OVERFLOW
……               	;沒有溢出,結果正確
OVERFLOW:   ……           	;溢出處理

例:記錄BX中1的個數,利用進位標誌進行判斷,使用JC/JB/JNAE或JNC/JNB/JAE指令實現轉移

1   XOR  AL , AL
2   AGAIN: TEST  BX , 0FFFFH    ;等價於CMP  BX , 0
3	   JZ  NEXT
4	   SHL  BX , 1   ;邏輯左移,最高位移入進位標誌
5	   JNC  AGAIN
6	   INC  AL
7	   JMP  AGAIN
8   NEXT:  MOV COUNT , AL      ;AL保存1的個數

(2)通過判斷多個標誌位實現轉移

  • 爲了和有符號數區分,無符號數的大小用高(Above)、低(Below)表示,它需要利用CF確定高低、利用ZF標誌確定相等(Equal)。
  • 兩數的高低分成4種關係:低於(不高於等於)、不低於(高於、等於)、低於等於(不高於)、不低於等於(高於)
  • 也就是分別對應四條指令:JB(JNAE),JNB(JAE),JBE(JNA),JNBE(JA)。
  • A:高 B:低 E:等於 N:不
  • J和這4個字母可以組合成用於無符號數判斷大小的條件轉移指令。

例:比較兩個無符號數的大小,將較小的數存放在AX。

CMP  AX , BX  ;比較AX和BX
JBE  NEXT      	;檢測CF和ZF,
                        	;若 AX≤BX,則轉移到NEXT
XCHG  AX , BX   ;若AX>BX,交換
NEXT:  ……

例:比較兩個有符號數的大小,將較大的存放在AX。

CMP  AX , BX    	;比較AX和BX
JNL  NEXT       	;檢測SF和OF,
					;若AX≥BX,則轉移到NEXT
XCHG  AX , BX  	;若AX<BX,交換
NEXT:  ……

3. 循環指令

循環指令有以下四條,用於循環程序設計。
(1)JCXZ LABEL

CX = 0,則轉移;否則順序執行

(2)LOOP LABEL

CX←CX-1;若CX≠ 0,循環:
IP←IP + 位移量,否則,順序執行。用於循環次數已知

(3) LOOPZ/LOOPE LABEL

CX←CX-1 ;若CX ≠ 0且ZF = 1,循環;
IP←IP + 位移量;否則,順序執行

(4) LOOPNZ/LOOPNE LABEL

CX←CX-1;
若CX ≠ 0且ZF = 0,循環 ,IP←IP + 位移量
否則,順序執行

(3)和(4)可以用於有條件推出循環的程序。

例:記錄附加段中STRING字符串包含空格字符的個數。假設字符串長度爲X字節,結果存入指定的RESULT單元。

	MOV  CX , X     ;X是常數,設置循環次數
	MOV  SI , OFFSET   STRING 
           ;提供字符串的偏移地址
	XOR  BX , BX     	;BX清0,用於記錄空格數
	JCXZ  DONE      	;如果長度爲0,退出
	MOV  AL , 20H     ;空格的ASCII碼
	AGAIN:     CMP  AL , ES: [SI]    
				  ;判斷一個字符是否爲空格
  JNZ  NEXT    ;ZF = 0,不是空格,轉移
  INC  BX    ;ZF = 1,是空格,空格個數加1
NEXT:    INC  SI  ;地址指針指到下一個字符
	  LOOP  AGAIN  
         ;字符個數減1,不爲0則繼續循環
DONE:   MOV  RESULT , BX  ;保存結果

4. 子程序調用和返回指令

  • 子程序調用和返回指令用於調用子程序和從子程序返回。
  • 子程序通常是與主程序分開的、完成特定功能的一段程序,可以反覆使用。
  • 主程序執行子程序調用指令CALL,可以轉移到子程序,執行完後通過子程序返回指令RET,返回主程序繼續執行
  • CALL和RET指令均不影響標誌位。
子程序調用指令CALL

子程序調用CALL指令也可以分成段內調用(近調用)和段間調用(遠調用)。
有4種格式 (調用時下條指令地址要壓入堆棧)

(1) CALL LABEL
;段內調用,相對尋址:SP←SP - 2,
;SS:[SP] ←IP,IP←IP + 16位位移量
(2) CALL R16/M16
;段內調用,間接尋址:SP←SP - 2,
;SS:[SP] ←IP,IP←R16/M16
(3)CALL far ptr label ;段間調用,直接尋址:
;SP←SP – 2,SS:[SP] ←CS,SP←SP - 2,
; SS:[SP] ←IP ;IP←label偏移地址,CS←label段地址
(4)CALL far ptr mem ;段間調用,間接尋址:
;SP←SP – 2,SS:[SP] ←CS,
;SP←SP - 2,SS:[SP] ←IP
;IP←[mem],CS←[mem+2]
從指定主存單元讀出4個字節的地址,2個送IP,2個送段寄存器CS。

子程序返回指令RET

返回指令分爲段內返回和段間返回,系統自動識別

格式:

RET                   ;無參數段內返回:IP←SS:[SP],
                          ; SP←SP + 2

RET  i16          ;有參數段內返回:IP←SS:[SP],
   ;SP←SP + 2,SP←SP + i16(可刪除堆棧裏的數)

RET    ;無參數段間返回:IP←SS:[SP],
          ;SP←SP + 2  ;CS←SS:[SP],SP←SP+2
      
 RET  i16  ;有參數段間返回:IP←SS:[SP],    
                ;SP←SP + 2,CS←SS:[SP],
             ;SP←SP+2,SP←SP + i16

例:利用子程序完成將AL低4位中的一位十六進制數轉換成對應的ASCII碼。

	;主程序
	MOV  AL , 0BH  ;提供參數給AL
	CALL  HTOASC   ;調用子程序
	……
	;子程序
HTOASC:	AND  AL , 0FH    	;只取AL的低4位
		OR  AL , 30H       ;AL高4位變成3
		CMP  AL , 39H    	;是0~9,還是A~F
		JBE  HTOEND	;小於等於39H轉
		ADD  AL , 7        
              ;是A~F,其ASCII還要加上7
HTOEND:	RET                    	;子程序返回
注:由於子程序調用和返回均與堆棧有關,因此一定要正確使用堆棧,以免不能正確返回主程序。

5. 中斷指令

在程序運行時,遇到某些緊急情況(如停電),或者一些重要錯誤(如溢出),CPU應當暫停當前程序,去做相應的處理。

  • 處理器中止當前程序運行,轉去執行處理這些緊急情況,計算機技術叫做“中斷”;
  • 而轉去執行的處理中斷的子程序叫做“中斷服務程序”或“中斷處理程序”。
  • 當前程序被中斷的地方稱爲“斷點”。
  • 計算機設計了中斷指令可以執行中斷程序

中斷服務程序可以被認爲是一種特殊的子程序,可以存放在主存的任何位置。中斷服務程序的入口地址稱爲中斷向量,被安排在中斷向量表中。

對80X86 CPU,採用實地址方式時,中斷向量表放在主存的最低1KB區域內,物理地址爲000H~3FFH。向量表從0開始,每4字節對應一箇中斷,低字存放中斷服務程序的偏移地址IP,高字存放其段地址CS。中斷向量號n的中斷服務程序存放在中斷向量表4×n的物理地址處。

對32位的CPU,中斷向量表可以放在主存的任意區域,由中斷向量寄存器指明位置 ,根據中斷號查找中斷向量表,形成中斷服務程序入口地址。

中斷指令格式如下

INT  I8   ;中斷調用指令:I8爲8位的中斷向量號
   IRET      	;中斷返回指令:實現中斷返回
   INTO ;溢出中斷指令:檢查是否溢出(4號中斷)

爲保證中斷服務程序正確返回原來的程序,要把被中斷程序的斷點處邏輯地址CS:IP壓入堆棧保護,還要保存反映現場狀態的標誌寄存器FLAGS。然後,將從中斷向量表中獲取的中斷服務程序的入口地址送CS和IP寄存器轉去執行中斷服務程序

執行中斷指令時,獲得中斷向量號n之後,要做下列操作。

  1. 禁止新的可屏蔽中斷和單步中斷:IF=TF←0。
  2. 標誌寄存器入棧保護:SP←SP–2, SS: [SP]←FLAGS。
  3. 斷點地址入棧保存:SP←SP–2,SS: [SP]←CS;SP←SP–2,SS: [SP]←IP。
  4. 讀取中斷服務程序的起始地址:IP←[n×4],CS←[n×4+ 2]。

例如:INT 20H
將從80H開始的4個字節獲取20H中斷的服務程序入口地址。

中斷返回指令IRET實現從中斷服務程序返回原程序,要做下列操作:

  • 斷點地址出棧恢復:IP←SS: [SP],SP←SP + 2;CS←SS: [SP],SP←SP+2。
  • 標誌寄存器出棧恢復: FLAGS←SS: [SP],SP←SP+2。

中斷指令提供了又一種改變程序執行順序的方法,在計算機系統中,常利用它爲用戶提供硬件設備的驅動程序。個人計算機中的基本輸入/輸出系統BIOS和操作系統DOS都提供了豐富的中斷服務程序讓程序員調用。

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