【80X86汇编语言学习】【DOS功能调用】基本IO功能 (二)

例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



你可能感兴趣的:(汇编,80X86汇编,汇编程序语言设计,DOS,汇编语言,dos,实例,x86)