組合語言(十一)DOS功能呼叫之INT 21H 指令說明及使用方法
轉自:https://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html
很多初學組合語言的同學可能會對INT 21H這條指令感到困惑,不知道是什麼意思,下面就以一段簡單的程式為大家講解:
例如:需要鍵盤輸入,並且回顯。
AH的值需要查表取得,表在下面
指令:MOV AH,01
INT 21H
通過這樣兩條指令,輸入的字元就會被儲存在AL中。
表:DOS系統功能調INT 21H
AH |
功能 |
呼叫引數 |
返回引數 |
00 |
程式終止(同INT 20H) |
CS=程式段字首 |
|
01 |
鍵盤輸入並回顯 |
|
AL=輸入字元 |
02 |
顯示輸出 |
DL=輸出字元 |
|
03 |
非同步通迅輸入 |
|
AL=輸入資料 |
04 |
非同步通迅輸出 |
DL=輸出資料 |
|
05 |
印表機輸出 |
DL=輸出字元 |
|
06 |
直接控制檯I/O |
DL=FF(輸入) |
AL=輸入字元 |
07 |
鍵盤輸入(無回顯) |
|
AL=輸入字元 |
08 |
鍵盤輸入(無回顯) |
|
AL=輸入字元 |
09 |
顯示字串 |
DS:DX=串地址 |
|
0A |
鍵盤輸入到緩衝區 |
DS:DX=緩衝區首地址 |
(DS:DX+1)=實際輸入的字元數 |
0B |
檢驗鍵盤狀態 |
|
AL=00 有輸入 |
0C |
清除輸入緩衝區並 |
AL=輸入功能號 |
|
0D |
磁碟復位 |
|
清除檔案緩衝區 |
0E |
指定當前預設的磁碟驅動器 |
DL=驅動器號 0=A,1=B,... |
AL=驅動器數 |
0F |
開啟檔案 |
DS:DX=FCB首地址 |
AL=00 檔案找到 |
10 |
關閉檔案 |
DS:DX=FCB首地址 |
AL=00 目錄修改成功 |
11 |
查詢第一個目錄項 |
DS:DX=FCB首地址 |
AL=00 找到 |
12 |
查詢下一個目錄項 |
DS:DX=FCB首地址 |
AL=00 找到 |
13 |
刪除檔案 |
DS:DX=FCB首地址 |
AL=00 刪除成功 |
14 |
順序讀 |
DS:DX=FCB首地址 |
AL=00 讀成功 |
15 |
順序寫 |
DS:DX=FCB首地址 |
AL=00 寫成功 |
16 |
建檔案 |
DS:DX=FCB首地址 |
AL=00 建立成功 |
17 |
檔案改名 |
DS:DX=FCB首地址 |
AL=00 成功 |
19 |
取當前預設磁碟驅動器 |
|
AL=預設的驅動器號 0=A,1=B,2=C,... |
1A |
置DTA地址 |
DS:DX=DTA地址 |
|
1B |
取預設驅動器FAT資訊 |
|
AL=每簇的扇區數 |
1C |
取任一驅動器FAT資訊 |
DL=驅動器號 |
同上 |
21 |
隨機讀 |
DS:DX=FCB首地址 |
AL=00 讀成功 |
22 |
隨機寫 |
DS:DX=FCB首地址 |
AL=00 寫成功 |
23 |
測定檔案大小 |
DS:DX=FCB首地址 |
AL=00 成功(檔案長度填入FCB) |
24 |
設定隨機記錄號 |
DS:DX=FCB首地址 |
|
25 |
設定中斷向量 |
DS:DX=中斷向量 |
|
26 |
建立程式段字首 |
DX=新的程式段字首 |
|
27 |
隨機分塊讀 |
DS:DX=FCB首地址 |
AL=00 讀成功 |
28 |
隨機分塊寫 |
DS:DX=FCB首地址 |
AL=00 寫成功 |
29 |
分析檔名 |
ES:DI=FCB首地址 |
AL=00 標準檔案 |
2A |
取日期 |
|
CX=年 |
2B |
設定日期 |
CX:DH:DL=年:月:日 |
AL=00 成功 |
2C |
取時間 |
|
CH:CL=時:分 |
2D |
設定時間 |
CH:CL=時:分 |
AL=00 成功 |
2E |
置磁碟自動讀寫標誌 |
AL=00 關閉標誌 |
|
2F |
取磁碟緩衝區的首址 |
|
ES:BX=緩衝區首址 |
30 |
取DOS版本號 |
|
AH=發行號,AL=版本 |
31 |
結束並駐留 |
AL=返回碼 |
|
33 |
Ctrl-Break檢測 |
AL=00 取狀態 |
DL=00 關閉Ctrl-Break檢測 |
35 |
取中斷向量 |
AL=中斷型別 |
ES:BX=中斷向量 |
36 |
取空閒磁碟空間 |
DL=驅動器號 |
成功:AX=每簇扇區數 |
38 |
置/取國家資訊 |
DS:DX=資訊區首地址 |
BX=國家碼(國際電話字首碼) |
39 |
建立子目錄(MKDIR) |
DS:DX=ASCIIZ串地址 |
AX=錯誤碼 |
3A |
刪除子目錄(RMDIR) |
DS:DX=ASCIIZ串地址 |
AX=錯誤碼 |
3B |
改變當前目錄(CHDIR) |
DS:DX=ASCIIZ串地址 |
AX=錯誤碼 |
3C |
建立檔案 |
DS:DX=ASCIIZ串地址 |
成功:AX=檔案代號 |
3D |
開啟檔案 |
DS:DX=ASCIIZ串地址 |
成功:AX=檔案代號 |
3E |
關閉檔案 |
BX=檔案代號 |
失敗:AX=錯誤碼 |
3F |
讀檔案或裝置 |
DS:DX=資料緩衝區地址 |
讀成功: |
40 |
寫檔案或裝置 |
DS:DX=資料緩衝區地址 |
寫成功: |
41 |
刪除檔案 |
DS:DX=ASCIIZ串地址 |
成功:AX=00 |
42 |
移動檔案指標 |
BX=檔案代號 |
成功:DX:AX=新檔案指標位置 |
43 |
置/取檔案屬性 |
DS:DX=ASCIIZ串地址 |
成功:CX=檔案屬性 |
44 |
裝置檔案I/O控制 |
BX=檔案代號 |
DX=裝置資訊 |
45 |
複製檔案代號 |
BX=檔案代號1 |
成功:AX=檔案代號2 |
46 |
人工複製檔案代號 |
BX=檔案代號1 |
失敗:AX=錯誤碼 |
47 |
取當前目錄路徑名 |
DL=驅動器號 |
(DS:SI)=ASCIIZ串 |
48 |
分配記憶體空間 |
BX=申請記憶體容量 |
成功:AX=分配記憶體首地 |
49 |
釋放內容空間 |
ES=記憶體起始段地址 |
失敗:AX=錯誤碼 |
4A |
調整已分配的儲存塊 |
ES=原記憶體起始地址 |
失敗:BX=最大可用空間 |
4B |
裝配/執行程式 |
DS:DX=ASCIIZ串地址 |
失敗:AX=錯誤碼 |
4C |
帶返回碼結束 |
AL=返回碼 |
|
4D |
取返回程式碼 |
|
AX=返回程式碼 |
4E |
查詢第一個匹配檔案 |
DS:DX=ASCIIZ串地址 |
AX=出錯程式碼(02,18) |
4F |
查詢下一個匹配檔案 |
DS:DX=ASCIIZ串地址 |
AX=出錯程式碼(18) |
54 |
取盤自動讀寫標誌 |
|
AL=當前標誌值 |
56 |
檔案改名 |
DS:DX=ASCIIZ串(舊) |
AX=出錯碼(03,05,17) |
57 |
置/取檔案日期和時間 |
BX=檔案代號 |
DX:CX=日期和時間 |
58 |
取/置分配策略碼 |
AL=0 取碼 |
成功:AX=策略碼 |
59 |
取擴充錯誤碼 |
|
AX=擴充錯誤碼 |
5A |
建立臨時檔案 |
CX=檔案屬性 |
成功:AX=檔案代號 |
5B |
建立新檔案 |
CX=檔案屬性 |
成功:AX=檔案代號 |
5C |
控制檔案存取 |
AL=00封鎖 |
失敗:AX=錯誤碼 |
62 |
取程式段字首 |
|
BX=PSP地址 |