上一篇博文是用C语言进行统计各字符个数的程序。真是简单的很。
以前,做而论道还用汇编写过大小写转换的程序,也可以统计各字符的个数,还有发音的功能。
因为没有被采纳,也就没有发表。现在写出来,和C语言的程序搭个伴。
;----------------------
程序要求:
编写一段程序,能够将一段英文文章中的大写字母变成小写字母,小写字母变成大写字母;
并统计出每个字母出现的次数,在屏幕中显示出来,每显示一个字母就发出一声提示音。
原题网址:http://zhidao.baidu.com/question/127760427.html
;----------------------
后来,经过百度Hi与提问者交流,对问题有所深入了解:
字符串是用键盘键入的,不用打开文件。
统计字母的个数,不用区分大小写。
根据这些,编写好了程序,程序执行时显示的画面如下:
程序如下:
;功能:输入字符串;大小写转换;统计各字符个数
; 输出个数时有发音提示
;************************************************
DATA SEGMENT PARA PUBLIC 'DATA'
IN_M DB 255
N_SUM DB 0 ;输入文字的总数
_TXT_ DB 256 DUP(' ') ;输入文字区
N_CCC DB 128 DUP(0) ;各个字符的个数
TIUI1 DB 7, 13, 10, 13, 10, 'Please input STR:', 13, 10, '$'
TIUI2 DB 7, 13, 10, 13, 10, 'The TXT is: ', 13, 10, '$'
TIUI3 DB 7, 13, 10, 13, 10, 'Please press any key... $'
T_SUM DB 7, 13, 10, 13, 10, 'SUM: $'
DATA ENDS
;************************************************
CODE SEGMENT PARA PUBLIC 'CODE'
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主程序区
MAIN PROC FAR
ASSUME CS:CODE, DS:DATA, ES:DATA
START:
MOV AX, DATA
MOV DS, AX
;--------------------------------
LEA DX, TIUI1
MOV AH, 9 ;显示字符串
INT 21H
LEA DX, IN_M
MOV AH, 10 ;键盘输入字符串
INT 21H
CMP N_SUM, 0
JNE JIXV
MOV AH, 4CH ;如果输入零个字符
INT 21H ;就结束程序
JIXV:
LEA DX, TIUI2
MOV AH, 9 ;显示字符串
INT 21H
;-------------下面是统计、大小写转换、显示
MOV CH, 0
MOV CL, N_SUM
LEA SI, _TXT_
L1: MOV AL, [SI]
INC SI
LEA BX, N_CCC
MOV AH, 0
ADD BX, AX
INC BYTE PTR [BX];统计每个字符的个数
CMP AL, 'A'
JB DIS
CMP AL, 'z'
JA DIS
CMP AL, 'Z'
JBE CHG
CMP AL, 'a'
JB DIS
CHG:XOR AL, 20H ;大小写转换
DIS:MOV DL, AL ;显示出来
;都显示了,此处省略了非英文字符的过滤功能,上次发表的有这个功能
MOV AH, 2
INT 21H
LOOP L1
;--------------------------------
LEA DX, T_SUM
MOV AH, 9 ;显示字符串
INT 21H
MOV AL, N_SUM
CALL DIS_AL
;--------------------------------
CALL _CR_LF
CALL _CR_LF
;---------------下面是显示每个字符的出现次数
LEA SI, N_CCC
ADD SI, 41H
MOV CH, 5
MOV CL, 26
L2:
MOV DX, SI
SUB DX, OFFSET N_CCC
MOV AH, 2
INT 21H
MOV DL, ':'
MOV AH, 2
INT 21H
MOV AL, [SI]
ADD AL, [SI + 32]
INC SI
CALL DIS_AL
CALL _BEEP
DEC CH
JNZ L3
MOV CH, 5
CALL _CR_LF
JMP L4
L3: CALL _TAB_2
L4: DEC CL
JNZ L2
;--------------------------------
_END_M:
LEA DX, TIUI3
MOV AH, 9 ;显示字符串
INT 21H
MOV AH, 1
INT 21H
MOV AH, 4CH
INT 21H ;程序结束
MAIN ENDP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~子程序区
_CR_LF PROC NEAR
MOV DL, 13
MOV AH, 2
INT 21H
MOV DL, 10
INT 21H
RET
_CR_LF ENDP
;--------------------------------
_TAB_2 PROC NEAR
MOV DL, 9
MOV AH, 2
INT 21H
INT 21H
RET
_TAB_2 ENDP
;--------------------------------
_BEEP PROC NEAR
MOV DL, 7
MOV AH, 2 ;显示由DL指定的字符
INT 21H
CALL DELAY ;延时
RET
_BEEP ENDP
;--------------------------------
DIS_AL PROC NEAR ;以10进制显示AL中的数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CL, AL
MOV AH, 2
MOV DL, '0' ;共显示四位,使得显示画面比较整齐
INT 21H
MOV AX, 0
MOV AL, CL
MOV BL, 100
DIV BL
MOV CL, AH
ADD AL, 48
MOV DL, AL ;显示百位数
MOV AH, 2
INT 21H
MOV AX, 0
MOV AL, CL
MOV BL, 10
DIV BL
MOV CL, AH
ADD AL, 48
MOV DL, AL
MOV AH, 2
INT 21H
MOV AL, CL
ADD AL, 48
MOV DL, AL
MOV AH, 2
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
DIS_AL ENDP
;--------------------------------
DELAY PROC ;软件延时
PUSH CX
;--------------------
MOV CX, 10000 ;0~65525, 控制延时时间
D1: PUSH CX
LOOP $
POP CX
LOOP D1
;--------------------
POP CX
RET
DELAY ENDP
;--------------------------------
CODE ENDS
END START
;=============================================
后记:
本程序,实际上要比“最佳答案”的程序要好一些。
1.“最佳答案”的程序,是使用9号功能调用来显示的,它遇到“$”后,就停止了,后面的字符就不显示了。
做而论道的程序,就没有这个缺陷,可以把输入的字符全部都显示出来。
2.“最佳答案”的程序,当输入字符较多时,显示出来就太长了,在屏幕上显示不全。
做而论道的程序,显示字符个数的时候,是分成5列显示的,这就不会超出一个屏幕的范围。
差别还有一些。呵呵,提问者判断不清这些优缺点,要求太低了。
有兴趣的网友可以到原来的题目网页上去对比,看看做而论道的说法是否正确。
;=============================================