8086汇编语言编程--大小写转换、统计个数、显示时还要求发音

时间:2023-01-01 00:44:21

上一篇博文是用C语言进行统计各字符个数的程序。真是简单的很。
以前,做而论道还用汇编写过大小写转换的程序,也可以统计各字符的个数,还有发音的功能。
因为没有被采纳,也就没有发表。现在写出来,和C语言的程序搭个伴。
;----------------------
程序要求:
编写一段程序,能够将一段英文文章中的大写字母变成小写字母,小写字母变成大写字母;
并统计出每个字母出现的次数,在屏幕中显示出来,每显示一个字母就发出一声提示音。
原题网址:http://zhidao.baidu.com/question/127760427.html
;----------------------
后来,经过百度Hi与提问者交流,对问题有所深入了解:
字符串是用键盘键入的,不用打开文件。
统计字母的个数,不用区分大小写。

根据这些,编写好了程序,程序执行时显示的画面如下:

8086汇编语言编程--大小写转换、统计个数、显示时还要求发音

图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/695d4a004a90f6031e426ae23912b31bb251ed83.html

程序如下:

;功能:输入字符串;大小写转换;统计各字符个数
;   输出个数时有发音提示
;************************************************
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列显示的,这就不会超出一个屏幕的范围。

差别还有一些。呵呵,提问者判断不清这些优缺点,要求太低了。

有兴趣的网友可以到原来的题目网页上去对比,看看做而论道的说法是否正确。
;=============================================