- DATAS SEGMENT
- STRING1 DB'Please input a string:
- ;输入提示信息
- STRING2 DB'Number of letter:
- ;各类字符提示信息
- STRING3 DB'Number of digits:
-
- STRING4 DB'Number of others:
-
- STRING5 DB'Number of upperletter:
- STRING6 DB'Number of lowerletter:
- LETTER DB 0 ;字母
- UPPERLETTER DB 0;大写字母
- LOWERLETTER DB 0;小写字母
- DIGIT DB 0 ;数字
- OTHERS DB 0 ;其他
- DATAS ENDS
- STACKS SEGMENT PARA STACK 'STACK';此处输入堆栈段代码
- DB 256 DUP(?)
- STACKS ENDS
- CODES SEGMENT
- ASSUME CS:CODES,DS:DATAS,SS:STACKS
- start: MOV AX,DATAS
- MOV DS,AX
- LEA DX,STRING1 ;显示输入提示信息Please input a string,LEA取指功能实现。
- MOV AH,09H ;09H为字符串输出
- INT 21H ;中断调用,INT 21H 中断为DOS中断
- MOV CX,80 ;设置循环次数足够大,CX用来保存循环指令
- L1: MOV AH,01H ;中断调用,单字符输入,01H带回显的键盘输入,
- INT 21H ;输入符号的ASCII代码在AL寄存器中。
- CMP AL,0DH ;若输入回车符则结束,CMP比较指令。如果为数字:30H---39H
- JZ OVER2 ;JZ条件转移指令,根据ZF进位转移
- CMP AL,30H ;若<30H(0),OTHERS++
- JB OTHER ;JB条件转移指令,为低于不高于指令。
- CMP AL,39H ;若>39H(9),跳转进一步比较
- JA ONE ;JA条件转移指令。为高于/不低于指令。
- JMP DIGITAL ;DIGIT++,JMP无条件转移指令,
- ONE: CMP AL,41H ;若IF<41H(A),OTHERS++ 如果为大写字母“A-Z”字符:41H---5AH
- JB OTHER
- CMP AL,5AH ;若IF>5AH(Z),跳转继续比较
- JA TWO
- JMP CHAR1 ;检测为大写字母,字母和大写字母数加一
- TWO: CMP AL,61H ;若IF<61H(a),OTHERS++ 如果为小写字母字符“a-z”字符:61H--7AH
- JB OTHER
- CMP AL,7AH
- JA OTHER
- JMP CHAR2 ;检测为小写字母,字母和小写字母数加一
- JMP OVER ;比较结束
- OTHER: INC OTHERS
- JMP OVER
- CHAR1: INC LETTER ;字母
- INC UPPERLETTER ;大写字母
- JMP OVER ;比较结束
- CHAR2: INC LETTER ;字母
- INC LOWERLETTER ;小写字母
- JMP OVER ;结束比较
- DIGITAL:INC DIGIT ;DIGIT++
- JMP OVER ;比较结束
- JMP OVER ;比较结束
- OVER: NOP
- LOOP L1 ;循环,输入下一字符
- OVER2: CALL HUANHUANG ;回车换行
- LEA DX,STRING2 ;字符串的输出Number of letter
- MOV AH,09H ;09H为字符串输出
- INT 21H ;中断调用,INT 21H 中断为DOS中断
- XOR AX,AX
- MOV AL,LETTER ;将统计的数字送 AX
- CALL OUTPUT ;调用输出两位数字的子程序
- CALL HUANHUANG ;回车换行
-
-
- LEA DX,STRING5 ;字符串的输出Number of upperletter
- MOV AH,09H ;09H为字符串输出
- INT 21H
- XOR AX,AX
- MOV AL,UPPERLETTER ;将统计的数字送AX
- CALL OUTPUT ;调用输出两位数字的子程序
- CALL HUANHUANG ;回车换行
- LEA DX,STRING6 ;字符串的输出Number of lowerletter:
- MOV AH,09H ;09H为字符串输出
- INT 21H
- XOR AX,AX
- MOV AL,LOWERLETTER ;将统计的数字送AX
- CALL OUTPUT ;调用输出两位数字的子程序
- CALL HUANHUANG ;回车换行
- LEA DX,STRING3 ;字符串的输出为Number of digits:
- MOV AH,09H ;09H为字符串输出
- INT 21H
- XOR AX,AX
- MOV AL,DIGIT ;将统计的数字送AX
- CALL OUTPUT ;调用输出两位数字的子程序
- CALL HUANHUANG ;回车换行
- LEA DX,STRING4 ;字符串的输出Number of others
- MOV AH,09H ;09H为字符串输出
- INT 21H
- XOR AX,AX
- MOV AL,OTHERS ;将统计的数字送AX
- CALL OUTPUT ;调用输出两位数字的子程序
- MOV AH,4CH ;4CH带返回码结束
- INT 21H
-
- HUANHUANG PROC NEAR ;控制输出格式,输出回车换行子程序
- MOV AH,02H
- MOV DL,0AH ;0AH键盘输入至缓冲区
- INT 21H ;输出换行符
- MOV AH,02H
- MOV DL,0DH ;0DH键盘复位。
- INT 21H ;输出回车符
- RET
- HUANHUANG ENDP
-
- OUTPUT PROC NEAR ;输出两位数字的子程序(输出两位数字为十进制)
- MOV BL,10
- DIV BL ;AX/BL,AL=商,AH=余数
- PUSH AX ;保存AX中的信息
- MOV DL,AL
- ADD DL,30H ;十进制转为ASCAII码
- MOV AH,02H ;显示一个字符
- INT 21H ;输出十位数
- POP AX ;出栈送AX
- MOV DL,AH
- ADD DL,30H
- MOV AH,02H ;显示一个字符
- INT 21H ;输出个位数
- RET
- OUTPUT ENDP
- CODES ENDS
- END START
复制代码
|