DOS系统功能调用步骤:
1. AH <- 功能号
2.指定寄存器放入该功能所要求的入口参数
3.执行int 21H
4.分析出口参数
单字符输入输出
01h键盘输入 AL=输入字符
02h显示器输出 DL=输出字符
07h直接控制台输入(无回显) AL=输入字符
08键盘输入(无回显) AL=输入字符
======================汇编例子======================
data segment
s db 1
data ends
prog segment
main proc far
assume cs:prog, ds:data
start:
mov ax,data
mov ds,ax
mov ah,01h
int 21h ;获取输入的单个字符
mov bx,offset s
mov byte ptr ds:[bx],al ;必须是bx,寄存器间接寻址,把获取的字符存到s
mov dl,0ah
mov ah,02h
int 21h ;输出换行符
mov dl,s
mov ah,02h
int 21h ;输出刚才获取到的字符
mov ax,4c00h
int 21h
main endp
prog ends
end start
字符串输入输出
09h显示字符串 DS:DX=字符缓冲区首地址
0ah带缓冲的键盘输入(字符串) DS:DX=键盘缓冲区首地址
0ah功能要求用户指定一个输入缓冲区来存放字符。缓冲区一般定义在数据段,其定义格式有严格的要求,如下的结构。第一个字节为用户自定义的缓冲区长度,若输入的字符数(包括回车符)大于此值,则喇叭会发出嘟嘟的警告生,并且光标不再右移直到输入回车符为止;第二个字节为实际输入的字符数(不包括回车符),有0ah号功能自动填入;DOS从第三个字节开始存放输入的字符。
|缓冲区长度N|实际读入的字符数|DOS从键盘读入的字符|
1 2 3 N+2
|----------------N+2个字节的缓冲区---------------|
09h显示字符串功能。09h号功能是DOS调用独有的,该功能要求被显示的字符串必须已‘$‘字符作为结束符。调用该功能前若有输入,则应在调用该功能之前输出换行符,否则输出会覆盖输入的一行。如本例若不换行则看不出输出的结果。
======================汇编例子======================
data segment
buf db 50
len db ?
chars db 50 dup(?) ;定义52个字节的缓冲区
data ends
prog segment
main proc far
assume cs:prog, ds:data
start:
mov ax,data
mov ds,ax
lea dx,buf
mov ah,0ah
int 21h ;字符串输入
mov dl,0ah
mov ah,02h
int 21h ;换行,否则显示的行会覆盖输入时的行,看不出输出
xor ch,ch
mov cl,len
mov dx,offset chars
mov bx,dx
add bx,cx
mov byte ptr [bx],‘$‘
mov ah,09h
int 21h ;显示字符串
mov ax,4c00h
int 21h
main endp
prog ends
end start