思路:
/*简略版*/
键盘输入一系列字符未知,假设有30个字符
用0AH号功能将输入的字符串送入用户缓冲区。
接着利用CMP指令比较在数字'0'到'9'之间的字符个数
//用总字符个数减去数字字符个数便是非数字字符的个数
使用自减DEC指令
令DL初始值为总字符数个数,出现一个数字字符便使DL自减1
最后将DL寄存器内容送入BUF缓冲区
/*唠叨版*/
先是数据段,涉及到的数据有:键盘输入的字符串、最后要送到BUF缓冲区的非数字字符的个数。
所以,在对数据段进行定义时,
先在BUF区定义一个字节型的数据,初始值为0
然后因为要输入一串字符,
所以定义一个STRING区存放数据,依次为初始定义的字符数、实际输入的字符数,以及实际存放的字符。
然后就是代码段:将变量进行初始的定义,存放一些待使用的数据,准备之后的使用
首先是用户输入的字符要进行显示,所以要用到0A号的缓冲区显示功能,
然后是将STRING+1位置的内容,即实际输入的字符数放在CL中,
因为LOOP循环会用到CX,所以将CL清零,
DL中存放实际输入的字符。
然后要对输入的字符的进行比较,如果小于0,直接看下一个,如果大于9也直接看下一个字符,只有是数字字符的将DL自减1
一直循环CX次,直至实际字符都比较完成。
汇编源程序:
.486
DATA SEGMENT USE16 /*数据段伪指令定义,逻辑段采用16位寻址方式*/
BUF DB 0 /*这个空间是用来存放最后的非字符数的*/
STRING DB 30 /*STRING单元初始定义30个字节*/
DB ? /*实际存储的字符个数*/
DB 30DUP(?) /*实际字符存放的位置*/
DATA ENDS
/*以上为数据段定义*/
CODE SECMENT USE16
ASSUME CS:CODE,DS:DATA/*ASSUME伪指令通知汇编程序,CODE是代码段,对其寻址是CS寄存器;DS是数据段,对其寻址采用CS寄存器*/
BEG MOVE AX, DATA
MOVE DS, AX /*数据段初始化*/
MOV AH,0AH /**键盘输入,缓冲区显示字符*/
MOV DX,OFFSET STRING /*显示的输入字符串*/
INT 21H
MOV CL,STRING+1 /*CL中存放实际字符的个数*/
MOV CH,0 /*循环中用不到数字*/
MOV DL,CL /*DL中存的是实际输入的字符的个数*/
MOV BX,OFFSET STRING+2 /*BX中取实际输入的字符*/
LAST: CMP BYTE PTR [BX],30H /*将字符与0进行比较*/
JC NEXT /*如果小于0就跳转到NEXT*/
CMP BYTE PTR [BX],3AH /*将字符与10进行比较*/
JNC NEXT /*如果不小于10,即大于等于10就跳转到NEXT*/
DEC DL /*如果在0~9之间就让DL即总字符数自减1,一直比较,最后DL就是非数字字符的个数*/
NEXT: INC BX /*让BX自加1,之后BX寻址取得的就是下一个存储单元的内容*/
LOOP LAST /*然后继续跳转到LAST语句,比较下一字符是不是数字字符*/
MOV BUF,DL /*最后实际输入的字符都比较完之后,将DL中存放的非数字字符数存入BUF单元中*/
MOV AH,4CH /*结束运行的程序*/
INT 21H
CODE ENDS
END BEG