1. 程式人生 > >組合語言(十一)DOS功能呼叫之INT 21H 指令說明及使用方法

組合語言(十一)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(輸入)
DL=字元(輸出)

AL=輸入字元

07

鍵盤輸入(無回顯)

 

AL=輸入字元

08

鍵盤輸入(無回顯)
檢測Ctrl-Break

 

AL=輸入字元

09

顯示字串

DS:DX=串地址
'$'結束字串

 

0A

鍵盤輸入到緩衝區

DS:DX=緩衝區首地址
(DS:DX)=緩衝區最大字元數

(DS:DX+1)=實際輸入的字元數

0B

檢驗鍵盤狀態

 

AL=00 有輸入
AL=FF 無輸入

0C

清除輸入緩衝區並
請求指定的輸入功能

AL=輸入功能號
(1,6,7,8,A)

 

0D

磁碟復位

 

清除檔案緩衝區

0E

指定當前預設的磁碟驅動器

DL=驅動器號 0=A,1=B,...

AL=驅動器數

0F

開啟檔案

DS:DX=FCB首地址

AL=00 檔案找到
AL=FF 檔案未找到

10

關閉檔案

DS:DX=FCB首地址

AL=00 目錄修改成功
AL=FF 目錄中未找到檔案

11

查詢第一個目錄項

DS:DX=FCB首地址

AL=00 找到
AL=FF 未找到

12

查詢下一個目錄項

DS:DX=FCB首地址
(檔案中帶有*或?)

AL=00 找到
AL=FF 未找到

13

刪除檔案

DS:DX=FCB首地址

AL=00 刪除成功
AL=FF 未找到

14
 

順序讀
 

DS:DX=FCB首地址
 

AL=00 讀成功
  =01 檔案結束,記錄中無資料
  =02 DTA空間不夠
  =03 檔案結束,記錄不完整

15

順序寫

DS:DX=FCB首地址

AL=00 寫成功
  =01 盤滿
  =02 DTA空間不夠

16

建檔案

DS:DX=FCB首地址

AL=00 建立成功
  =FF 無磁碟空間

17

檔案改名

DS:DX=FCB首地址
(DS:DX+1)=舊檔名
(DS:DX+17)=新檔名

AL=00 成功
AL=FF 未成功

19

取當前預設磁碟驅動器

 

AL=預設的驅動器號 0=A,1=B,2=C,...

1A

置DTA地址

DS:DX=DTA地址

 

1B
 

取預設驅動器FAT資訊
 

 

AL=每簇的扇區數
DS:BX=FAT標識位元組
CX=物理扇區大小
DX=預設驅動器的簇數

1C

取任一驅動器FAT資訊

DL=驅動器號

同上

21
 

隨機讀
 

DS:DX=FCB首地址
 

AL=00 讀成功
  =01 檔案結束
  =02 緩衝區溢位
  =03 緩衝區不滿

22

隨機寫

DS:DX=FCB首地址

AL=00 寫成功
  =01 盤滿
  =02 緩衝區溢位

23

測定檔案大小

DS:DX=FCB首地址

AL=00 成功(檔案長度填入FCB)
AL=FF 未找到

24

設定隨機記錄號

DS:DX=FCB首地址

 

25

設定中斷向量

DS:DX=中斷向量
AL=中斷型別號

 

26

建立程式段字首

DX=新的程式段字首

 

27
 

隨機分塊讀
 

DS:DX=FCB首地址
CX=記錄數

AL=00 讀成功
  =01 檔案結束
  =02 緩衝區太小,傳輸結束
  =03 緩衝區不滿

28

隨機分塊寫

DS:DX=FCB首地址
CX=記錄數

AL=00 寫成功
  =01 盤滿
  =02 緩衝區溢位

29

分析檔名

ES:DI=FCB首地址
DS:SI=ASCIIZ串
AL=控制分析標誌

AL=00 標準檔案
  =01 多義檔案
  =02 非法碟符

2A

取日期

 

CX=年
DH:DL=月:日(二進位制)

2B

設定日期

CX:DH:DL=年:月:日

AL=00 成功
  =FF 無效

2C

取時間

 

CH:CL=時:分
DH:DL=秒:1/100秒

2D

設定時間

CH:CL=時:分
DH:DL=秒:1/100秒

AL=00 成功
  =FF 無效

2E

置磁碟自動讀寫標誌

AL=00 關閉標誌
AL=01 開啟標誌

 

2F

取磁碟緩衝區的首址

 

ES:BX=緩衝區首址

30

取DOS版本號

 

AH=發行號,AL=版本

31

結束並駐留

AL=返回碼
DX=駐留區大小

 

33
 

Ctrl-Break檢測
 

AL=00 取狀態
  =01 置狀態(DL)
DL=00 關閉檢測
  =01 開啟檢測

DL=00 關閉Ctrl-Break檢測
  =01 開啟Ctrl-Break檢測

35

取中斷向量

AL=中斷型別

ES:BX=中斷向量

36

 

取空閒磁碟空間

 

DL=驅動器號 
0=預設,1=A,2=B,...
 

成功:AX=每簇扇區數
     BX=有效簇數
     CX=每扇區位元組數
     DX=總簇數
失敗:AX=FFFF

38

置/取國家資訊

DS:DX=資訊區首地址

BX=國家碼(國際電話字首碼)
AX=錯誤碼

39

建立子目錄(MKDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3A

刪除子目錄(RMDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3B

改變當前目錄(CHDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3C

建立檔案

DS:DX=ASCIIZ串地址
CX=檔案屬性

成功:AX=檔案代號
錯誤:AX=錯誤碼

3D
 

開啟檔案
 

DS:DX=ASCIIZ串地址
AL=0 讀
  =1 寫
  =3 讀/寫

成功:AX=檔案代號
錯誤:AX=錯誤碼

3E

關閉檔案

BX=檔案代號

失敗:AX=錯誤碼

3F
 

讀檔案或裝置
 

DS:DX=資料緩衝區地址
BX=檔案代號
CX=讀取的位元組數

讀成功:
  AX=實際讀入的位元組數
  AX=0 已到檔案尾
讀出錯:AX=錯誤碼

40

寫檔案或裝置

DS:DX=資料緩衝區地址
BX=檔案代號
CX=寫入的位元組數

寫成功:
  AX=實際寫入的位元組數
寫出錯:AX=錯誤碼

41

刪除檔案

DS:DX=ASCIIZ串地址

成功:AX=00
出錯:AX=錯誤碼(2,5)

42

 

移動檔案指標

 

BX=檔案代號
CX:DX=位移量
AL=移動方式(0:從檔案頭絕對位移,1:從當前位置相對移動,2:從檔案尾絕對位移)

成功:DX:AX=新檔案指標位置
出錯:AX=錯誤碼
 

43
 

置/取檔案屬性
 

DS:DX=ASCIIZ串地址
AL=0 取檔案屬性
AL=1 置檔案屬性
CX=檔案屬性

成功:CX=檔案屬性
失敗:CX=錯誤碼

44



 

裝置檔案I/O控制



 

BX=檔案代號
AL=0 取狀態
  =1 置狀態DX
  =2 讀資料
  =3 寫資料
  =6 取輸入狀態
  =7 取輸出狀態

DX=裝置資訊



 

45

複製檔案代號

BX=檔案代號1

成功:AX=檔案代號2
失敗:AX=錯誤碼

46

人工複製檔案代號

BX=檔案代號1
CX=檔案代號2

失敗:AX=錯誤碼

47

取當前目錄路徑名

DL=驅動器號
DS:SI=ASCIIZ串地址

(DS:SI)=ASCIIZ串
失敗:AX=出錯碼

48

分配記憶體空間

BX=申請記憶體容量

成功:AX=分配記憶體首地
失敗:BX=最大可用記憶體

49

釋放內容空間

ES=記憶體起始段地址

失敗:AX=錯誤碼

4A

調整已分配的儲存塊

ES=原記憶體起始地址
BX=再申請的容量

失敗:BX=最大可用空間
     AX=錯誤碼

4B
 

裝配/執行程式
 

DS:DX=ASCIIZ串地址
ES:BX=引數區首地址
AL=0 裝入執行
AL=3 裝入不執行

失敗:AX=錯誤碼
 

4C

帶返回碼結束

AL=返回碼

 

4D

取返回程式碼

 

AX=返回程式碼

4E

查詢第一個匹配檔案

DS:DX=ASCIIZ串地址
CX=屬性

AX=出錯程式碼(02,18)

4F

查詢下一個匹配檔案

DS:DX=ASCIIZ串地址
(檔名中帶有?或*)

AX=出錯程式碼(18)

54

取盤自動讀寫標誌

 

AL=當前標誌值

56

檔案改名

DS:DX=ASCIIZ串(舊)
ES:DI=ASCIIZ串(新)

AX=出錯碼(03,05,17)

57

置/取檔案日期和時間

BX=檔案代號
AL=0 讀取
AL=1 設定(DX:CX)

DX:CX=日期和時間
失敗:AX=錯誤碼

58

取/置分配策略碼

AL=0 取碼
AL=1 置碼(BX)

成功:AX=策略碼
失敗:AX=錯誤碼

59
 

取擴充錯誤碼
 

 

AX=擴充錯誤碼
BH=錯誤型別
BL=建議的操作
CH=錯誤場所

5A

建立臨時檔案

CX=檔案屬性
DS:DX=ASCIIZ串地址

成功:AX=檔案代號
失敗:AX=錯誤碼

5B

建立新檔案

CX=檔案屬性
DS:DX=ASCIIZ串地址

成功:AX=檔案代號
失敗:AX=錯誤碼

5C

 

控制檔案存取

 

AL=00封鎖
  =01開啟
BX=檔案代號
CX:DX=檔案位移
SI:DI=檔案長度

失敗:AX=錯誤碼

 

62

取程式段字首

 

BX=PSP地址