例2:写一个程序,它先接受一个字符串,然后显示其中的数字符的个数、英文字母的个数和字符串的长度
本 实例用到的DOS系统调用如下:
1、显示字符串(9号功能调用)
功 能:在标准输出上显示一个字符串。通常情况下,标准输出就是屏幕
入口参数:DS:DX=需要输出字符串的首地址,字符串以’$‘为结束标志
出口参数:无
说 明:在显示输出的时候检查是否按Ctrl+C或者Ctrl+Break键,否则程序退出。
2、输入字符串(0AH号功能调用)
功 能:从表中输入中读取一个字符串,通常情况下,标准输入就是键盘。
入口参数:DS:DX=缓冲区首地址,
出口参数:接收到的字符串在缓冲区中
说 明:(1)缓冲区中第一个字为缓冲区最大容量,可认为是入口参数;缓冲区第二字节存放实际读入的
字符数(不包括回车符),可认为是出口参数的一部分,第三字节开始存放接受的字符串。
(2)字符串以回车符结束,回车符是字符串的最后一个字符。
(3)如果输入的字符数超过缓冲区所能容纳的最大值,则随后输入的字符被丢弃,并响铃,直至遇到回车符。
(4)按Ctrl+C或者Ctrl+Break键,则程序退出
3、显示输出(2号功能调用)
功 能:像标准输出设备中写一个字符,通常情况下,标准输出为屏幕
入口参数:DL=要输出显示的字符ASCII码
出口参数:无
说 明:按Ctrl+C或者Ctrl+Break键,否则程序退出
代码如下:
MLENGTH = 128 ;定位常量,缓冲区最大的长度
DSEG SEGMENT
BUFF DB MLENGTH ;第一个字节存放缓冲区的最大值
DB ? ;第二个字节存放实际字符串的长度
DB MLENGTH DUP (0) ;真实字符串
MESSG0 DB 'Please input:$'
MESSG1 DB 'Length = $'
MESSG2 DB 'X = $'
MESSG3 DB 'Y = $'
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS, AX ;设置DS寄存器
MOV DX,OFFSET MESSG0 ;显示提示信息
CALL DISPMESS
;
MOV DX,OFFSET BUFF ;调用10号调用,获取输出字符串
MOV AH,10
INT 21H
CALL NEWLINE ;显示换行符和回车符
MOV BH,0 ;清空数字字符计数器
MOV BL,0 ;清空字符计数器
MOV CL,BUFF+1 ;获取输入字符串的长度
MOV CH,0
JCXZ COK ;判断字符串是否为空,以回车符为结束
MOV SI,OFFSET BUFF+2 ;获取存放字符串的首地址
AGAIN: MOV AL,[SI] ;获取字符
INC SI ;指针加一
CMP AL,'0'
JB NEXT
CMP AL,'9' ;判断是否是否数字
JA NODEC
INC BH ;数字计数累加
JMP SHORT NEXT
NODEC: OR AL,20H ;如果是字母转换为小写字母
CMP AL,'a'
JB NEXT
CMP AL,'z'
JA NEXT
INC BL ;字母计数累加
NEXT: LOOP AGAIN
;
COK: MOV DX,OFFSET MESSG1 ;显示提示信息
CALL DISPMESS
MOV AL,BUFF+1 ;获取字符串的长度
XOR AH,AH
CALL DISPAL ;以十进制数的形式显示
CALL NEWLINE
;
MOV DX,OFFSET MESSG2 ;显示数字的个数
CALL DISPMESS
MOV AL,BH
XOR AH,AH
CALL DISPAL
CALL NEWLINE
;
MOV DX,OFFSET MESSG3 ;显示字母的个数
CALL DISPMESS
MOV AL, BL
XOR AH, AH
CALL DISPAL
CALL NEWLINE
;
MOV AX,4C00H
INT 21H
;用十进制显示8位二进制
DISPAL PROC
MOV CX,3 ;8位二进制数最大表示为3为十进制数
MOV DL,10 ;除数为10
DISP1: DIV DL ;AX/DL=AL(商) AH(余数)
XCHG AH,AL ;交换AL,AH,使AL保存余数
ADD AL,'0' ;转换为ASCII码
PUSH AX ;将Ax保存到栈中,其中主要用到AL,后续显示过程会用到AL
XCHG AH,AL ;是AL中继续保持商
MOV AH,0 ;清空AH
LOOP DISP1 ;继续循环测试
;
MOV CX,3
DISP2: POP DX
CALL ECHOCH
LOOP DISP2
RET
DISPAL ENDP
ECHOCH PROC
MOV AH,2
INT 21H
RET
ECHOCH ENDP
;显示有DX所指的提示信息
DISPMESS PROC
MOV AH,9
INT 21H
RET
DISPMESS ENDP
;显示换行符和回车符
NEWLINE PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
CSEG ENDS
END START