鱼C论坛

 找回密码
 立即注册
查看: 3543|回复: 5

[已解决]汇编:统计出现的次数

[复制链接]
发表于 2020-11-3 18:24:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

输入一行字符,
统计 数字、大写字母、小写字母 及其它字符的出现频率。

进而分别统计每个数字、字母的出现频率。
并按出现频率的高低 从高到低 将其输出。

比如,输入:23*/\aaaaCCBBBBBB5555

输出结果:
数字的出现次数为:6
大写字母的出现次数为:8
小写字母的出现次数为:4
其它字符的出现次数为:3


出现六次的字符有:B
出现四次的字符有:a 5
出现两次的字符有:C
出现一次的字符有:2 3
最佳答案
2020-11-7 22:45:09
本帖最后由 xieglt 于 2020-11-7 23:02 编辑
  1. assume cs:code,ds:data

  2. data segment
  3.                 count        DW        256        dup(0)
  4.                 count4Number        DW  0
  5.                 count4Uletter        DW  0
  6.                 count4Lletter   DW  0
  7.                 count4Other                DW        0

  8.                 msg1 db "number count:",36
  9.                 msg2 db "upcase letter count:",36
  10.                 msg3 db "lowcase letter count:",36
  11.                 msg4 db "other character count:",36
  12.                 msg5 db "  times appeared character:",36
  13. data ends

  14. code segment
  15. _Break        MACRO
  16.         NOP
  17.         INT        1H
  18.         NOP
  19.                 ENDM

  20. _EnterLine        MACRO
  21.         MOV                AH,02
  22.         MOV                DL,0AH
  23.         INT                21H
  24.         MOV                DL,0DH
  25.         INT                21H
  26.                         ENDM

  27. _PushAll        MACRO
  28.         PUSH        SI
  29.         PUSH    DI
  30.         PUSH    BX
  31.         PUSH    CX
  32.         PUSH    DX
  33.                         ENDM

  34. _PopAll        MACRO
  35.         POP                DX
  36.         POP                CX
  37.         POP                BX
  38.         POP                DI
  39.         POP                SI
  40.                 ENDM
  41. _start:
  42.         MOV                AX,DATA
  43.         MOV                DS,AX
  44.         MOV                ES,AX

  45.         XOR                AX,AX
  46.         LEA                DI,count
  47.         MOV                CX,256
  48. _@1:
  49.         INC                DI
  50.         STOSB
  51.         INC                AX
  52.         LOOP        _@1

  53.         CALL        _InputChar
  54.         CALL        _Sort
  55.         CALL        _Output

  56.         MOV                AX,4C00H
  57.         INT                21H

  58. _Output        PROC
  59.         _EnterLine
  60.         MOV                AH,9
  61.         LEA                DX,msg1
  62.         INT                21H
  63.         PUSH        count4Number
  64.         CALL        _OutputByte
  65.         _EnterLine
  66.        
  67.         MOV                AH,9
  68.         LEA                DX,msg2
  69.         INT                21H
  70.         PUSH        count4Uletter
  71.         CALL        _OutputByte
  72.         _EnterLine
  73.        
  74.         MOV                AH,9
  75.         LEA                DX,msg3
  76.         INT                21H
  77.         PUSH        count4Lletter
  78.         CALL        _OutputByte
  79.         _EnterLine
  80.        
  81.         MOV                AH,9
  82.         LEA                DX,msg4
  83.         INT                21H
  84.         PUSH        count4Other
  85.         CALL        _OutputByte
  86.         _EnterLine

  87.         MOV                CX,256
  88.         LEA                SI,count
  89.         XOR                BX,BX

  90. _OutputLoop:
  91.         LODSW
  92.         TEST        AL,AL
  93.         JE                _OutEnd
  94.         CMP                AL,BL
  95.         JE                _SameTimes

  96.         MOV                BL,AL
  97.         PUSH        AX
  98.         _EnterLine

  99.         PUSH        BX
  100.         CALL        _OutputByte

  101.         MOV                AH,9
  102.         LEA                DX,msg5
  103.         INT                21H
  104.         POP                AX

  105.         MOV                DL,AH
  106.         MOV                AH,2
  107.         INT                21H
  108.         JMP                _@@1
  109. _SameTimes:
  110.         PUSH        AX
  111.         MOV                AH,02
  112.         MOV                DL,','
  113.         INT                21H
  114.         POP                AX
  115.         MOV                DL,AH
  116.         MOV                AH,2
  117.         INT                21H
  118. _@@1:
  119.         LOOP        _OutputLoop
  120. _OutEnd:
  121.         RET
  122. _Output        ENDP

  123. _InputChar        PROC
  124.         LEA                DI,count
  125.         LEA                SI,count4number
  126.         XOR                CX,CX
  127. _@2:
  128.         MOV                AH,1
  129.         INT                21H
  130.         CMP                AL,0DH
  131.         JE                _@3

  132.         ;小于32大于等于127的字符放弃(32是空格,126是~)
  133.         CMP                AL,32
  134.         JL                _@2
  135.         CMP                AL,127
  136.         JAE                _@2
  137.        
  138.         ;判断数字
  139.         CMP                AL,'0'
  140.         JL                _@4
  141.         CMP                AL,'9'
  142.         JG                _@5
  143.         ;是数字
  144.         INC                BYTE PTR [SI]
  145.         JMP                _@7
  146. _@5:
  147.         ;判断大写字母
  148.         CMP                AL,'A'
  149.         JL                _@4
  150.         CMP                AL,'Z'
  151.         JG                _@6
  152.         ;是大写字母
  153.         INC                BYTE PTR [SI+2]
  154.         JMP                _@7
  155. _@6:
  156.         ;判断小写字母
  157.         CMP                AL,'a'
  158.         JL                _@4
  159.         CMP                AL,'z'
  160.         JG                _@4
  161.         ;是小写字母
  162.         INC                BYTE PTR [SI+4]
  163.         JMP                _@7
  164. _@4:
  165.         ;是其他字符
  166.         INC                BYTE PTR [SI+6]
  167. _@7:
  168.         XOR                AH,AH
  169.         SHL                AX,1
  170.         MOV                BX,AX
  171.         ;统计每个字符的出现次数
  172.         INC                BYTE PTR [DI+BX]
  173.        
  174.         ;控制输入字符不超过255个
  175.         INC                CX
  176.         CMP                CX,255
  177.         JGE                _@3
  178.         JMP                _@2
  179. _@3:
  180.         RET
  181. _InputChar        ENDP

  182. ;字符出现次数排序
  183. _Sort        PROC
  184.         LEA                DI,count
  185.         MOV                CX,256
  186. _outLoop:       
  187.         PUSH        CX
  188.         DEC                CX
  189.         CMP                CX,1
  190.         JE                _SortOver
  191.         MOV                BX,CX
  192. _innerLoop:
  193.         PUSH        BX
  194.         SUB                BX,CX
  195.         SHL                BX,1
  196.         MOV                AX,[DI+BX]
  197.         CMP                AL,[DI+BX+2]
  198.         JAE                _BigThan
  199.         PUSH        [DI+BX+2]
  200.         POP                [DI+BX]
  201.         PUSH        AX
  202.         POP                [DI+BX+2]
  203. _BigThan:
  204.         POP                BX
  205.         LOOP        _innerLoop
  206.         POP                CX
  207.         LOOP        _outLoop
  208. _SortOver:
  209.         POP                CX
  210.         RET
  211. _Sort        ENDP

  212. _OutputByte        PROC
  213.         PUSH        BP
  214.         MOV                BP,SP
  215.         SUB                SP,4
  216.         _PushAll

  217.         MOV                WORD PTR [BP-2],0
  218.         MOV                WORD PTR [BP-4],100

  219.         MOV                CX,3
  220.         MOV                AX,[BP+4]
  221. _OBLoop:
  222.         XOR                DX,DX
  223.         DIV                WORD PTR [BP-4]
  224.         XCHG        AX,DX
  225.         TEST        DX,DX
  226.         JNE                _OutputIt
  227.         MOV                BX,[BP-2]
  228.         TEST        BX,BX
  229.         JE                _NoOutput
  230. _OutputIt:
  231.         PUSH        AX
  232.         MOV                AH,02
  233.         ADD                DL,030H
  234.         INT                21H
  235.         INC                WORD PTR [BP-2]
  236.         POP                AX
  237. _NoOutput:
  238.         PUSH        AX
  239.         XOR                DX,DX
  240.         MOV                AX,[BP-4]
  241.         MOV                BX,10
  242.         DIV                BX
  243.         MOV                [BP-4],AX
  244.         POP                AX
  245.         LOOP        _OBLoop

  246.         MOV                AX,[BP-2]
  247.         TEST        AX,AX
  248.         JNE                _OBEnd
  249.         MOV                AH,2
  250.         MOV                DL,'0'
  251.         INT                21H
  252. _OBEnd:

  253.         _PopAll
  254.         ADD                SP,4
  255.         MOV                SP,BP
  256.         POP                BP
  257.         RET                2
  258. _OutputByte        ENDP

  259. CODE        ENDS
  260. END _start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-7 22:45:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-7 23:02 编辑
  1. assume cs:code,ds:data

  2. data segment
  3.                 count        DW        256        dup(0)
  4.                 count4Number        DW  0
  5.                 count4Uletter        DW  0
  6.                 count4Lletter   DW  0
  7.                 count4Other                DW        0

  8.                 msg1 db "number count:",36
  9.                 msg2 db "upcase letter count:",36
  10.                 msg3 db "lowcase letter count:",36
  11.                 msg4 db "other character count:",36
  12.                 msg5 db "  times appeared character:",36
  13. data ends

  14. code segment
  15. _Break        MACRO
  16.         NOP
  17.         INT        1H
  18.         NOP
  19.                 ENDM

  20. _EnterLine        MACRO
  21.         MOV                AH,02
  22.         MOV                DL,0AH
  23.         INT                21H
  24.         MOV                DL,0DH
  25.         INT                21H
  26.                         ENDM

  27. _PushAll        MACRO
  28.         PUSH        SI
  29.         PUSH    DI
  30.         PUSH    BX
  31.         PUSH    CX
  32.         PUSH    DX
  33.                         ENDM

  34. _PopAll        MACRO
  35.         POP                DX
  36.         POP                CX
  37.         POP                BX
  38.         POP                DI
  39.         POP                SI
  40.                 ENDM
  41. _start:
  42.         MOV                AX,DATA
  43.         MOV                DS,AX
  44.         MOV                ES,AX

  45.         XOR                AX,AX
  46.         LEA                DI,count
  47.         MOV                CX,256
  48. _@1:
  49.         INC                DI
  50.         STOSB
  51.         INC                AX
  52.         LOOP        _@1

  53.         CALL        _InputChar
  54.         CALL        _Sort
  55.         CALL        _Output

  56.         MOV                AX,4C00H
  57.         INT                21H

  58. _Output        PROC
  59.         _EnterLine
  60.         MOV                AH,9
  61.         LEA                DX,msg1
  62.         INT                21H
  63.         PUSH        count4Number
  64.         CALL        _OutputByte
  65.         _EnterLine
  66.        
  67.         MOV                AH,9
  68.         LEA                DX,msg2
  69.         INT                21H
  70.         PUSH        count4Uletter
  71.         CALL        _OutputByte
  72.         _EnterLine
  73.        
  74.         MOV                AH,9
  75.         LEA                DX,msg3
  76.         INT                21H
  77.         PUSH        count4Lletter
  78.         CALL        _OutputByte
  79.         _EnterLine
  80.        
  81.         MOV                AH,9
  82.         LEA                DX,msg4
  83.         INT                21H
  84.         PUSH        count4Other
  85.         CALL        _OutputByte
  86.         _EnterLine

  87.         MOV                CX,256
  88.         LEA                SI,count
  89.         XOR                BX,BX

  90. _OutputLoop:
  91.         LODSW
  92.         TEST        AL,AL
  93.         JE                _OutEnd
  94.         CMP                AL,BL
  95.         JE                _SameTimes

  96.         MOV                BL,AL
  97.         PUSH        AX
  98.         _EnterLine

  99.         PUSH        BX
  100.         CALL        _OutputByte

  101.         MOV                AH,9
  102.         LEA                DX,msg5
  103.         INT                21H
  104.         POP                AX

  105.         MOV                DL,AH
  106.         MOV                AH,2
  107.         INT                21H
  108.         JMP                _@@1
  109. _SameTimes:
  110.         PUSH        AX
  111.         MOV                AH,02
  112.         MOV                DL,','
  113.         INT                21H
  114.         POP                AX
  115.         MOV                DL,AH
  116.         MOV                AH,2
  117.         INT                21H
  118. _@@1:
  119.         LOOP        _OutputLoop
  120. _OutEnd:
  121.         RET
  122. _Output        ENDP

  123. _InputChar        PROC
  124.         LEA                DI,count
  125.         LEA                SI,count4number
  126.         XOR                CX,CX
  127. _@2:
  128.         MOV                AH,1
  129.         INT                21H
  130.         CMP                AL,0DH
  131.         JE                _@3

  132.         ;小于32大于等于127的字符放弃(32是空格,126是~)
  133.         CMP                AL,32
  134.         JL                _@2
  135.         CMP                AL,127
  136.         JAE                _@2
  137.        
  138.         ;判断数字
  139.         CMP                AL,'0'
  140.         JL                _@4
  141.         CMP                AL,'9'
  142.         JG                _@5
  143.         ;是数字
  144.         INC                BYTE PTR [SI]
  145.         JMP                _@7
  146. _@5:
  147.         ;判断大写字母
  148.         CMP                AL,'A'
  149.         JL                _@4
  150.         CMP                AL,'Z'
  151.         JG                _@6
  152.         ;是大写字母
  153.         INC                BYTE PTR [SI+2]
  154.         JMP                _@7
  155. _@6:
  156.         ;判断小写字母
  157.         CMP                AL,'a'
  158.         JL                _@4
  159.         CMP                AL,'z'
  160.         JG                _@4
  161.         ;是小写字母
  162.         INC                BYTE PTR [SI+4]
  163.         JMP                _@7
  164. _@4:
  165.         ;是其他字符
  166.         INC                BYTE PTR [SI+6]
  167. _@7:
  168.         XOR                AH,AH
  169.         SHL                AX,1
  170.         MOV                BX,AX
  171.         ;统计每个字符的出现次数
  172.         INC                BYTE PTR [DI+BX]
  173.        
  174.         ;控制输入字符不超过255个
  175.         INC                CX
  176.         CMP                CX,255
  177.         JGE                _@3
  178.         JMP                _@2
  179. _@3:
  180.         RET
  181. _InputChar        ENDP

  182. ;字符出现次数排序
  183. _Sort        PROC
  184.         LEA                DI,count
  185.         MOV                CX,256
  186. _outLoop:       
  187.         PUSH        CX
  188.         DEC                CX
  189.         CMP                CX,1
  190.         JE                _SortOver
  191.         MOV                BX,CX
  192. _innerLoop:
  193.         PUSH        BX
  194.         SUB                BX,CX
  195.         SHL                BX,1
  196.         MOV                AX,[DI+BX]
  197.         CMP                AL,[DI+BX+2]
  198.         JAE                _BigThan
  199.         PUSH        [DI+BX+2]
  200.         POP                [DI+BX]
  201.         PUSH        AX
  202.         POP                [DI+BX+2]
  203. _BigThan:
  204.         POP                BX
  205.         LOOP        _innerLoop
  206.         POP                CX
  207.         LOOP        _outLoop
  208. _SortOver:
  209.         POP                CX
  210.         RET
  211. _Sort        ENDP

  212. _OutputByte        PROC
  213.         PUSH        BP
  214.         MOV                BP,SP
  215.         SUB                SP,4
  216.         _PushAll

  217.         MOV                WORD PTR [BP-2],0
  218.         MOV                WORD PTR [BP-4],100

  219.         MOV                CX,3
  220.         MOV                AX,[BP+4]
  221. _OBLoop:
  222.         XOR                DX,DX
  223.         DIV                WORD PTR [BP-4]
  224.         XCHG        AX,DX
  225.         TEST        DX,DX
  226.         JNE                _OutputIt
  227.         MOV                BX,[BP-2]
  228.         TEST        BX,BX
  229.         JE                _NoOutput
  230. _OutputIt:
  231.         PUSH        AX
  232.         MOV                AH,02
  233.         ADD                DL,030H
  234.         INT                21H
  235.         INC                WORD PTR [BP-2]
  236.         POP                AX
  237. _NoOutput:
  238.         PUSH        AX
  239.         XOR                DX,DX
  240.         MOV                AX,[BP-4]
  241.         MOV                BX,10
  242.         DIV                BX
  243.         MOV                [BP-4],AX
  244.         POP                AX
  245.         LOOP        _OBLoop

  246.         MOV                AX,[BP-2]
  247.         TEST        AX,AX
  248.         JNE                _OBEnd
  249.         MOV                AH,2
  250.         MOV                DL,'0'
  251.         INT                21H
  252. _OBEnd:

  253.         _PopAll
  254.         ADD                SP,4
  255.         MOV                SP,BP
  256.         POP                BP
  257.         RET                2
  258. _OutputByte        ENDP

  259. CODE        ENDS
  260. END _start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 22:48:04 | 显示全部楼层
本帖最后由 xieglt 于 2020-11-7 22:50 编辑

无标题.jpg

不能输出中文,把提示信息都改了.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 11:18:38 | 显示全部楼层
xieglt 发表于 2020-11-7 22:48
不能输出中文,把提示信息都改了.

感谢,就是我现在在看小甲鱼的从零开始学汇编,总共77集,然后现在我看到50集了,但是我对于这样的题目还是无从下手。所以我问一下,要看到多少集,才能写出这个程序,还是说看完也写不出来,需要另外学东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-8 11:55:14 From FishC Mobile | 显示全部楼层
不能光看,要多写程序,哪怕照着别人的程序敲一遍也好。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 12:01:59 | 显示全部楼层
xieglt 发表于 2020-11-8 11:55
不能光看,要多写程序,哪怕照着别人的程序敲一遍也好。

ok
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表