DOS 功能调用是指汇编程序通过INT 21H软中断来调用DOS内部子程序完成特定的一系列操作的一种方法。
在学习和使用汇编语言过程中,用户不可能,也没有必要从最底层的第一个操作开始。例如打印字符串,若所有工作都由用户程序去做,是不现实的。而调用系统已有的程序就是一种有效的方法。而DOS功能调用就提供了这种方法。
1、调用方法
调用前将功能号送AH寄存器,同时根据功能号规定的要求准备好所有的参数,然后执行INT 21H。
例如:显示一个字符‘A’
MOV DL,41H ;字符‘A’的ASCII码41H
MOV AH,02H
INT 21H
1、“1号功能”–1H功能调用—-从键盘读入一个字符
MOV AH,01H
INT 21H ;读入的字符在AL寄存器
2、“2号功能”–2H功能调用—-显示器输出一个字符
MOV DL,字符 ;ASCII码,例如:41H
;MOV DL,41H ;输出‘A’,方法一
;MOV DL,'A' ;输出‘A’,方法二
MOV AH,02H
INT 21H
3、“9号功能”–9H功能调用—-显示器输出一串字符
DS 指向字符串所在的段 ;一般不必显式地装入
DX 指向字符串串首的位移 ;例如:MOV DX,OFFSET HM
MOV AH,09H
INT 21H
说明:
要求字符串必须以’$’作结束标志,回车换行用0DH,0AH
。例如:
HM DB 'hello world',0DH,0AH,'$' ;在数据段定义
4、“40号功能”–40H功能调用—-显示器输出一串字符
DS 指向字符串所在的段 ;一般不必显式地装入
DX 指向字符串串首的位移 ;例如:MOV DX,OFFSET HM--位移用OFFSET
CX 为字符串长度
BX 送入1
MOV AH,40H
INT 21H
说明:
字符串不必以’$’作结束标志,回车换行用0DH,0AH
但应给出字符串长度。例如:
比较:
与9号功能比较,40号功能多两个参数,但是不必美元符结束。
HM DB 'hello world',0DH,0AH,'$' ;在数据段定义
5、4CH功能调用—-结束程序
MOV AH,4CH ;或MOV AX,4C00H
INT 21H
1、在COM文件或DEBUG下
所写程序可以用INT 20H
或INT 3H
结束程序。
2、在汇编源程序中:
(1)可用 4CH 功能调用结束程序。例如:
MOV AH,4CH ;或MOV AX,4C00H
INT 21H
(3)可用RET结束程序。
但必须将执行模块定义为过程。例如:
P1 PROC FAR
PUSH AX
MOV AX,02H
ADD AX,05H
RET
P1 ENDP
......
END P1
40号功能输出字符串:
DATA SEGMENT
HM DB 'hello yuanlifu!',0DH,0AH;显示字符串
LM EQU $-HM ;$在表达式中,表示当前地址
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ;装入数据段寄存器
MOV DX,OFFSET HM
MOV CX,LM ;字符长度
MOV BX,01H ;规定BX送1
MOV AH,40H ;40H功能调用
INT 21H
MOV AH,4CH ;结束程序
INT 21H
CODE ENDS
END START
9号功能输出字符串–方法一:
DATAS SEGMENT
STRING DB 'hello yuanlifu!!','$';显示字符串
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
9号功能输出字符串–方法二
DATA SEGMENT
HM DB 'hello liefyuan!',0DH,0AH,'$';显示字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
GO PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET HM
MOV AH,9
INT 21H
RET
GO ENDP
CODE ENDS
END GO