3、位操做指令
位操做指令包括位測試和位掃描指令,能夠直接對一個二進制位進行測試,設置和掃描。
1 位測試和設置指令
格式:BT DEST,SRC
BTC DEST,SRC
BTR DEST,SRC
BTS DEST,SRC
功能:按照源操做指定的位號,測試目的操做數,當指令執行時,被測試位的狀態被複制到進位標誌CF。
BT將SRC指定的DEST中一位的數值複製到CF。BTC將SRC指定的DEST中一位的數值複製到CF,且將DEST中該位取反。BTR將SRC 指定的DEST中一位的數值複製到CF,且將DEST中該位復位。BTS將SRC指定的DEST中一位的數值複製到CF,且將DEST中該位置位。
目的操做數爲16位或32位通用寄存器或存儲器,源操做數爲16位或32位通用寄存器,以及8位當即數,當源操做數爲通用寄存器時,必須同目的操做數類型一致。源操做數SRC以兩種方式給出目的操做數的位號,即
· SRC爲8位當即數,以二進制形式直接給出要操做的位號;
· SRC爲通用寄存器,若是DEST爲通用寄存器,則SRC中二進制值直接給出要操做的位號。若是DEST爲存儲器操做數,通用寄存器SRC爲帶符號整數, SRC的值除以DEST的長度所獲得的商做爲DEST的相對偏移量,餘數直接做爲要操做的位號。DEST的有效地址爲DEST給出的偏移地址和DEST相 對偏移量之和。
BT,BTC,BTR,BTS指令影響CF標誌位,其它標誌位無定義。
例 3.53
MOV AX,1234H
MOV ECX,5
BT AX,CX ;CF=1AX=1234H
BTC AX,5 ;CF=1;AX=1214H
BTS AX,CX; ;CF=0AX=1234H
BTR EAX,ECX ;CF=1EAX=00001214H
例 3.54
·MODEL SMALL
·586
·DATA
DATA1 DW 1234H,5678H
·CODE
·START UP
BTC DATA1,3;CF=0(DATA1)=123CH
MOV CX,20
BTR DATA1,CX;CF=1[DATA+2]=5668H
·EXIT
END
2 位掃描指令
格式:BSFDEST,SRC
BSRDEST,SRC
功能:BSF從低位開始掃描源操做數,若全部位都是0,則ZF=0,不然ZF=1。而且將第一個出現1的位號存入目的操做數。BSR從高位開始掃描源操做數,若全部位都是0,則ZF=0,不然ZF=1。而且將第一個出現1的位號存入目的操做數。
源操做數能夠爲16位32位通用寄存器或存儲器。目的操做數爲16位或32位通用寄存器。源操做數和目的操做數類型必須一致。
BSF,BSR指令影響ZF標誌位,其它標誌位無定義。
例 3.55
MOV EBX,0F333EE00H
BSR EAX,EBX;ZF=1EAX=0000001FH=31
BSF EDX,EBX;ZF=1EDX=00000009H
3 進位標誌指令
(1) 格式:CLC。功能:清除進位標誌。
(2) 格式:STC。功能:設置進位標誌。
(3) 格式:CMC。功能:進位標誌取反。
4 條件設置字節指令
條件設置指令用於根據條件設置某一狀態字節或標誌字節,見表3 3。
格式:SETcondDEST
功能:測試條件(cond)若爲真,則將目的操做數置01H,不然置00H。目的操做數容許爲8位通用寄存器或8位存儲器操做數。
條件cond與條件轉移指令中的條件相同,共分三類。
(1) 以標誌位狀態爲條件能夠測試的標誌位爲ZF,SF,OF,CF,PF。
(2) 以兩個無符號數比較爲條件條件爲高於、高於等於、低於、低於等於。
(3) 以兩個帶符號數比較爲條件條件爲大於、大於等於、小於、小於等於。
SET指令不影響標誌位。
使用邏輯運算類指令應注意:
· 若是沒有特別規定,參與運算的兩個操做數類型必須一致,且只容許一個爲存儲器操做數;
· 若是參與運算的操做數只有一個,且爲存儲器操做數,必須使用PTR僞指令說明其數據類型;
· 操做數不容許爲段寄存器;
· 目的操做數不容許爲當即數;
· 若是是存儲器尋址,則前面介紹的各類存儲器尋址方式都可使用。php
表 3.3 條件設置字節指令程序員
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
3.3.4控制轉移類指令
計算機執行程序通常是順序地逐條執行指令。但常常需要根據不一樣條件作不一樣的處理,有時須要跳過幾條指令,有時須要重複執行某段程序,或者轉移到另外一個程序段去執行。用於控制程序流程的指令包括轉移、循環、過程調用和中斷調用。
1、轉移指令
1 無條件轉移指令
格式:JMP TARGET
功能:使程序無條件地轉移到指令規定的目的地址TARGET去執行指令。轉移分爲短轉移、段內轉移(近程轉移)和段間轉移(遠程轉移)。
(1) 段內直接轉移:
格式:JMP SHORT TARGET;短轉移
JMP NEAR PTR TARGET;近程轉移
功能:採用相對尋址將當前IP值(即JMP指令下一條指令的地址)與JMP指令中給出的偏移量之和送IP中。段內短轉移(SHORT)指令偏移量爲8 位,容許轉移偏移值的範圍爲-128~+127。段內近程轉移(NEAR)指令在16位指令模式下,偏移量爲16位,容許轉移偏移值範圍爲-215~+ 215-1。在32位指令模式下,偏移值範圍爲-231~+231-1。編程
例 3.56
JMP NEXT
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
NEXT:MOV AL,BL
本例爲無條件轉移到本段內,標號爲NEXT的地址去執行指令,彙編程序能夠肯定目的地址與JMP指令的距離。
(2) 段內間接轉移:
格式:JMP REG
JMP NEAR PTR [REG]
功能:段內間接轉移,其中JMP REG指令地址在通用寄存器中,將其內容直接送IP實現程序轉移。JMP NEAR PTR [REG]指令地址在存儲器中,默認段寄存器根據參與尋址的通用寄存器來肯定,將指定存儲單元的字取出直接送IP實現程序轉移。在16位指令模式,轉移偏 移值範圍爲
。在32位指令模式,轉移偏移值範圍爲
。
例 3.57 設DS=1000HEBX=00002000H。
JMP BX ;將2000H送IP
JMP NEAR PTR [BX] ;將地址1000∶2000單元存放的一個字送IP
JMP NEAR PTR [EBX] ;將段選擇符爲1000H,偏移地址爲00002000H單元存放的雙字送EIP。
(3) 段間直接轉移:
格式:JMP FAR PTR TARGET
功能:段間直接轉移,FAR PTR說明標號TARGET具備遠程屬性。將指令中由TARGET指定的段值送CS,偏移地址送IP。
例 3.58 JMP FAR PTR NEXT。
在16位指令模式下,段基地送CS,偏移地址爲16位,轉移偏移值範圍
;在32位指令模式下,代碼段選擇符送CS,偏移地址爲32位,轉移偏移值範圍爲
。
(4) 段間間接轉移:
格式:JMP FAR PTR [Reg]
功能:段間間接轉移,由FAR PTR [Reg]指定的存儲器操做數做爲轉移地址。
在16位指令模式下,存儲器操做數爲32位,包括16位段基址和16位偏移地址。
例 3.59
JMP FAR PTR [BX] ;數據段雙字存儲單元低字內容送IP
;數據段雙字存儲單元高字內容送CS
在32位指令模式下,存儲器操做數包括16位選擇符。
例 3.60 JMP FAR PTR [EAX]
指令中包含指向目標地址指針的門描述符或TSS描述符的指針,其所指的存儲器操做數中僅選擇符部分有效,指示調用門、任務門或TSS描述符起做用,而偏移部分不起做用。
2 條件轉移指令
該類指令是根據上一條指令對標誌寄存器中標誌位的影響來決定程序執行的流程,若知足指令規定的條件,則程序轉移;不然程序順序執行。
條件轉移指令的轉移範圍爲段內短轉移或段內近程轉移,不容許段間轉移。段內短轉移(short)的轉移偏移值範圍爲-128~+127。段內近程轉移,在16位指令模式下轉移偏移值範圍爲
,在32位指令模式下轉移偏移值範圍爲
。
條件轉移指令包括四類:單標誌位條件轉移;無符號數比較條件轉移;帶符號數比較條件轉移;測試CX條件轉移。
格式:Jcc TARGET
功能:若測試條件‘CC’爲真,則轉移到目標地址TARGET處執行程序。不然順序執行。
(1) 單標誌位條件轉移指令,見表3 4。
例 3.61 JZ NEXT;若標誌ZF=1則轉移到標號NEXT處執行。
(2) 無符號數比較條件轉移,見表3 5。
例 3.62 JA NEXT;無符號數A與B比較,若A>B則轉移到標號NEXT處執行程序數組
表 3.4 單標誌位條件轉移指令ide
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
表 3.5 無符號數比較條件轉移指令函數
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
表 3.6 帶符號數比較條件轉移指令post
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
例 3.63 JG NEXT;帶符號數A與B比較,若A>B則轉移到標號NEXT。
(4) 測試CX條件轉移,見表3 7。測試
表 3.7 測試CX條件轉移指令spa
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
例 3.64 JCXZ TARGET;CX=0轉移到標號TARGET處。
JECXZ TARGET;ECX=0轉移到標號TARGET處。
條件轉移指令通常緊跟在CMP或TEST指令以後,判斷執行CMP或TEST指令對標誌位的影響來決定是否轉移。
例 3.65 符號函數
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
假設x爲某值且存放在寄存器AL中,試編程將求出的函數值f(x)存放在AH中。
·MODEL TINY
·CODE
·STARTUP
CMPAL,0
JGE BIG
MOV AL,0FFH
JMP DONE
BIG: JE DONE
MOV AL,1
DONE:MOV AH,AL
·EXIT
END
例 3.66 編程實現把BX寄存器內的二進制數用十六進制數的形式在屏幕上顯示出來。
·MODEL TINY
·CODE
·STARTUP
MOV CH,4
AGAIN: MOV CL,4
ROL BX,CL
MOV AL,BL
ANDAL,0FH
OR AL,30H
CMP AL,3AH
JB NEXT
ADD AL,07H
NEXT: MOV DL,AL;DL←要顯示的ASCII碼
MOV AH,2;顯示
INT 21H
DECCH
JNZ AGAIN
·EXIT
END
2、循環控制指令
這類指令用(E)CX計數器中的內容控制循環次數,先將循環計數值存放在(E)CX中,每循環一次(E)CX內容減1,直到(E)CX爲0時循環結束。
格式:LOOPcc TARGET
功能:將(E)CX內容減1,不影響標誌位,若(E)CX不等於0,且測試條件‘CC’成立,則轉移到目標地址TARGET處執行程序。轉移範圍爲-128~+127。如表3 8所示。操作系統
表3.8 循環控制指令
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
例 3.67 計算 ![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
·MODEL TINY
·CODE
·STARTUP
XOR EAX,EAX
MOV EDX,1
MOV ECX,1000
SUM: ADD EAX,EDX
INC EDX
LOOPD SUM
·EXIT
END
例 3.68 找出以ARRAY爲首地址的100個字數組中的第一個非0項,送AX寄存器中。
·MODELSMALL
·DATA
ARRAYDW 0,0,0,0,1010H,…;(100個字)
·CODE
·STARTUP
MOV CX,64H
LEA BX,ARRAY
MOV SI,0FFFEH
ZERO: INC SI
INC SI
CMP WORD PTR [BX+SI],0
LOOPZ ZERO
MOV AX,[BX+SI]
·EXIT
END
關於過程調用和返回指令將在子程序一節中介紹。
3.3.5串操做指令
80x86提供處理字符串的操做。串指連續存放在存儲器中的一些數據字節、字或雙字。串操做容許程序對連續存放大的數據塊進行操做。
串操做一般以DS:(E)SI來尋址源串,以ES:(E)DI來尋址目的串,對於源串容許段超越。(E)SI或(E)DI這兩個地址指針在每次串操做 後,都自動進行修改,以指向串中下一個串元素。地址指針修改是增量仍是減量由方向標誌來規定。當DF=0,(E)SI及(E)DI的修改成增量;當DF= 1,(E)SI及(E)DI的修改成減量。根據串元素類型不一樣,地址指針增減量也不一樣,在串操做時,字節類型SI,DI加、減1;字類型SI,DI加、減 2;雙字類型ESI,EDI加、減4。若是須要連續進行串操做,一般加劇復前綴。重複前綴能夠和任何串操做指令組合,造成複合指令,見表3 9。
1、重複前綴指令
表 3.9 重複前綴指令
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
2、方向標誌指令
格式:CLD/STD
功能:CLD爲清除方向標誌,即將DF置‘0’。STD爲設置方向標誌,即將DF置‘1’。
3、串傳送指令
基本格式:[REP]MOVS DESTS, SRCS
[REP] MOVSB/MOVSW/MOVSD
功能:將DS:(E)SI規定的源串元素複製到ES:(E)DI規定的目的串單元中,見表3 10。
表 3.10 MOVS指令
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
該指令對標誌位無影響。
若是加劇復前綴REP,則能夠實現連續存放的數據塊的傳送,直到(E)CX=0爲止。
在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
例 3.69
·MODEL SMALL
·DATA
SRC DB 1,2,3,…(100個字節)
DEST DB 100DUP(?)
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,100
LEA SI,SRC
LEA DI,DEST
CLD
REP MOVSB
·EXIT
END
該程序將起始地址爲SRC的100個字節內容傳送到起始地址爲DEST的存儲單元。
4、串比較指令
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI規定的源串元素減去ES:(E)DI指出的目的串元素,結果不回送,僅影響標誌位CF,AF,PF,OF,ZF,SF。當源 串元素與目的串元素值相同時,ZF=1;不然ZF=0。每執行一次串比較指令,根據DF的值和串元素數據類型自動修改(E)SI和(E)DI。
在串比較指令前加劇復前綴REPE/Z,則表示重複比較兩個字符串,若兩個字符串的元素相同則比較到(E)CX=0爲止,不然結束比較。在串比較指令 前加劇復前綴REPNE/NZ,則表示若兩個字符串元素不相同時,重複比較直到(E)CX=0爲止,不然結束比較。
例 3.70 編程實現兩個串元素比較,如相同則將全「1」送SUT單元,不然全「0」送SUT單元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F G H’
SRC DB ‘A B C E F F F E’
SUT DB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,8
LEA SI,DEST
LEA DI,SRC
CLD
REPE CMPSB
JZ EQUL;ZF=1;CX=0
MOV BH,0;CX≠0,ZF=0
JMP DONE
EQUL: MOV BH,0FFH
DONE: MOV SUT,BH
·EXIT
END
5、串掃描指令
格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
功能:由AL,AX或EAX的內容減去ES:(E)DI規定的目的串元素,結果不回送,僅影響標誌位CF,AF,PF,SF,OF,ZF。當AL, AX或EAX的值與目的串元素值相同時,ZF=1;不然ZF=0。每執行一次串掃描指令,根據DF的值和串元素數據類型自動修改(E)DI。
在串掃描指令前加劇復前綴REPE/Z,則表示目的串元素值和累加器值相同時重複掃描,直到CX/ECX=0爲止,不然結束掃描。若加劇復前綴 REPNE/NZ,則表示當目的串元素值與累加器值不相等時,重複掃描直到CX/ECX=0時爲止,不然結束掃描。
該指令影響標誌位爲CF,AF,PF,SF,OF,ZF。
例 3.71 在內存DEST開始的6個單元尋找字符‘C’,如找到將字符‘C’的地址送ADDR單元,不然0送ADDR單元。
·MODEL SMALL
·DATA
DEST DB ‘A B C D E F’
ADDR DW?;存「C」的地址,因此設置爲字類型
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
MOV CX,6
LEA DI,DEST
MOV AL,‘C’
CLD
REPNE SCASB
JZ EQUL
MOV DI,0
JMP DONE
EQUL: DEC DI
DONE: MOV ADDR,DI
·EXIT
END
6、 串裝入指令
格式:LODS SRCS
LODSB/LODSW/LODSD
功能:將DS:SI/ESI所指的源串元素裝入累加器(AL,AX,EAX)中,每裝入一次都按照DF值以及串元素類型自動修改地址指針SI/ESI,該指令通常不須加劇復前綴,而且不影響標誌位。
7、 串存儲指令
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:將累加器\[AL,AX,EAX\]中值存入ES:DI/EDI所指的目的串存儲單元中,每傳遞一次,都按DF值以及串元素類型自動修改地址指 針DI/EDI。若加劇復前綴REP,則表示將累加器的值連續送目的串存儲單元,直到CX/ECX=0時爲止。
該指令不影響標誌位。
3.3.6輸入/輸出指令
1、 輸入指令
格式:IN DEST, SRC
功能:根據源操做數SRC給出的端口地址,將操做數從指定端口傳送到目的操做數DEST處,其中DEST爲AL,AX或EAX,端口地址SRC能夠直接形式給出8位端口地址,或由DX寄存器以間接形式給出。
例 3.72
IN AL,10H
IN AX,20H
IN EAX,30H
IN AL,DX
IN AX,DX
IN EAX,DX
2、 輸出指令
格式OUT DEST, SRC
功能:將源操做數SRC送到目的操做數DEST所指定的端口。其中源操做數SRC爲AL,AX或EAX,目的操做數能夠8位端口地址方式直接給出或以DX寄存器間接方式給出。
使用輸入、輸出指令應注意:
· 直接尋址方式端口地址爲8位,共有0~255個端口地址;
· 間接尋址方式,只能用DX做爲地址寄存器,尋址範圍爲64K字節;
· 每一個I/O地址對應的端口的數據長度爲8位,傳送8位數據佔用一個端口地址,傳送16位數據佔用2個端口地址,傳送32位數據佔用4個端口地址。
3、 串輸入指令
格式:[REP] INS DESTS, DX
[REP] INSB/INSW/INSD
功能:根據DX給出的端口地址,從外設讀入數據送入以ES:DI/EDI爲地址的目的串存儲單元中,每輸入一次,均根據DF的值和串元素類型自動修改 DI/EDI的值。若加劇復前綴REP,則表示連續從外設輸入串元素存入目的串存儲單元中,直到CX/ECX=0爲止。
例 3.73 從端口地址爲1000H處取數存入內存BLOCK單元。
·MODEL SMALL
·DATA
BLOCKDB?
·CODE
·STARTUP
MOV AX,@DATA
MOV ES,AX
CLD
LEA DI,BLOCK
MOV DX,1000H
INS BLOCK,DX
·EXIT
END
4、串輸出指令
格式:[REP] OUTS DX,SRCS
[REP] OUTSB/OUTSW/OUTSD
功能:將DS:SI/ESI所指的源串元素,按照DX寄存器指定的端口地址送往外設,每輸出一次,均根據DF的值和串元素類型自動修改SI/ESI的值,若加劇復前綴REP,則表示連續向外設輸出串元素,直到CX/ECX=0時爲止。
例 3.74 將內存BLOCK爲首地址的100個字符送往端口地址爲2000H的外設。
·MODEL SMALL
·DATA
BLOCKDB ‘A,B,…’(100個字符)
·CODE
·STARTUP
CLD
LEA SI,BLOCK
MOV CX,100
MOV DX,2000H
REP OUTSB
·EXIT
END
在使用帶重複前綴的串輸入輸出指令時,必須考慮端口的數據準備或接收狀態。
全部輸入輸出指令均不影響標誌位。
3.3.7處理器控制
1、 總線封鎖前綴
格式:LOCK指令
功能:LOCK爲指令前綴,可使LOCK引腳變成邏輯0,在LOCK引腳有效期間,禁止外部總線上的其它處理器存取帶有LOCK前綴指令的存儲器操做數。
可加LOCK前綴的指令:
(1) ADD/SUB/ADC/SBB/OR/XOR/AND Mem, Reg/imm;
(2) NOT/NEG/INC/NEC Mem;
(3) XCHG Reg, Mem或XCHG Mem, Reg;
(4) BT/BTS/BRT/BTC Mem, Reg/imm。
Mem爲存儲器操做數,Reg爲通用寄存器,imm爲當即數。
2、空操做
格式:NOP
功能:空操做,除使IP/EIP增1外,不作任何工做。該指令不影響標誌位。
3、處理器等待指令
格式:WAIT
功能:檢查BUSY引腳狀態,等待協處理器完成當前工做。
4、處理器暫停指令
格式:HLT
功能:暫停程序的執行。當產生一個外部中斷或非屏蔽中斷時,才繼續執行下一條指令。
3.3.8中斷指令與DOS功能調用
1、中斷指令
在實模式下,中斷矢量以4個字節存放在中斷矢量表中,中斷矢量表爲1k字節(00000H~003FFH),中斷矢量表容許存放256箇中斷矢量,每 箇中斷矢量包含一箇中斷服務程序地址(段值和16位偏移地址),中斷矢量地址指針由中斷類型碼乘以4獲得。
在保護模式下,用中斷描述符表代替中斷矢量表,每一箇中斷由8個字節的中斷描述符來講明,中斷描述符表容許256箇中斷描述符,每一箇中斷描述符包含一箇中斷服務地址(段選擇符、32位偏移地址、訪問權限等)。中斷描述符地址指針由中斷類型碼乘以8獲得。
中斷指令格式:INT n
功能:產生中斷類型碼爲n的軟中斷,該指令包含中斷操做碼和中斷類型碼兩部分,中斷類型碼n爲8位,取值範圍爲0~255(00H~FFH)。
軟中斷執行過程:
· 將標誌寄存器FLAGS(或EFLAGS)壓入堆棧;
· 清除TF和IF標誌位;
· CS,IP/EIP壓入堆棧;
· 實模式下,n×4獲取中斷矢量表地址指針;保護模式下,n×8獲取中斷描述符表地址指針;
· 根據地址指針,從中斷矢量表或中斷描述符表中取出中斷服務程序地址送IP/EIP和CS中,控制程序轉移去執行中斷服務程序。
中斷返回指令格式:IRET/IRETD
功能:該指令實如今中斷服務程序結束後,返回到主程序中斷斷點處,繼續執行主程序。
中斷返回執行過程:
· IRET指令彈出堆棧中數據送IP,CS,FLAGS;
· IRETD指令彈出堆棧中數據送EIP,CS,EFLAGS。
其它中斷類指令如表3 11所示。
表 3.11 中斷類指令
![80x86彙編指令詳解(下) 80x86彙編指令詳解(下)](http://static.javashuo.com/static/loading.gif)
2、DOS功能調用
系統功能調用是MS—DOS爲程序員編寫彙編語言源程序提供的一組子程序,包括設備管理、文件管理和目錄管理等。
DOS規定使用軟中斷指令INT 21H做爲進入各功能子程序的總入口,再爲每一個功能調用規定一個功能號,引用功能號便可進入相應的子程序入口。DOS系統功能調用的使用方法概括以下:
(1) 傳送入口參數到指定的寄存器中;
(2) 把要調用功能的功能號送入AH寄存器中;
(3) 用INT 21H指令轉入子程序入口;
(4) 相應的子程序運行結束後,能夠按照規定取得出口參數。
經常使用系統功能調用簡介。
1 鍵盤輸入單字符
這是1號系統功能調用,其調用格式爲
MOV AH,1
INT 21H
該功能調用無入口參數。其功能爲系統等待鍵盤輸入,如是Ctrol-Break鍵則退出;不然將鍵入字符的ASCII碼送入AL寄存器中,而且經過顯示器顯示該字符。
2 鍵盤輸入字符串
這是0AH號系統功能調用,其功能爲將鍵盤輸入的字符串寫入內存單元中。所以,首先在內存中定義一個緩衝區,緩衝區第一個字節存放規定字符串的最大字 節數,第二個字節由系統送入實際鍵入的字符數,從第三個字節開始用於存放鍵入的字符串,最後經過鍵入回車鍵來表示字符串的結束。若是實際鍵入的字符數未達 到最大規定數,其緩衝區的空餘區間填0;若是實際鍵入數超過緩衝區的容量,則超出的字符自動丟失,並且響鈴警告。注意,回車鍵值也存於緩衝區中。
例 3.75 使用格式舉例。
·MODEL SMALL
·DATA
BUF DB 20
DB?
DB 20 DUP(?)
·CODE
·STARTUP
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
·EXIT
END
該程序在BUF爲首地址的緩衝區定義了20個字符串字節的緩衝區,而且將緩衝區首地址送入DX中,調用0AH號子程序,系統等待用戶鍵入字符串,每鍵 入一個字符,其相應的ASCII碼將被寫入緩衝區中,直到鍵入回車鍵,由系統輸入實際鍵入字符數,送入緩衝區第二個字節中。
3 輸出單字符
這是2號系統功能調用,其使用格式爲:
MOV DL,‘A’
MOV AH,2
INT 21H
執行2號系統功能調用,將置入DL寄存器中的字符(以ASCII碼形式表示)經過顯示器顯示出來(或從打印機輸出)。
4 輸出字符串
這是9號系統功能調用,其功能是將指定的內存緩衝區中的字符串從顯示器顯示輸出(或從打印機輸出),緩衝區中的字符串以字符‘$’做爲結束標誌。
例 3.76使用格式舉例。 ·MODEL SMALL ·DATA BUF DB ‘Thank you $’ ·CODE ·STARTUP MOV DX,OFFSET BUF MOV AH,9 INT 21H ·EXIT END 5 返回操做系統 這是4CH號系統功能調用,使用格式爲 MOV AH,4CH INT 21H 在用戶程序結束處插入此調用,則返回到DOS操做系統,顯示器顯示系統提示符.