鱼C论坛

 找回密码
 立即注册
查看: 3061|回复: 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 编辑
assume cs:code,ds:data

data segment
                count        DW        256        dup(0)
                count4Number        DW  0
                count4Uletter        DW  0
                count4Lletter   DW  0
                count4Other                DW        0

                msg1 db "number count:",36
                msg2 db "upcase letter count:",36
                msg3 db "lowcase letter count:",36
                msg4 db "other character count:",36
                msg5 db "  times appeared character:",36
data ends

code segment
_Break        MACRO
        NOP
        INT        1H
        NOP
                ENDM

_EnterLine        MACRO
        MOV                AH,02
        MOV                DL,0AH
        INT                21H
        MOV                DL,0DH
        INT                21H
                        ENDM

_PushAll        MACRO
        PUSH        SI
        PUSH    DI
        PUSH    BX
        PUSH    CX
        PUSH    DX
                        ENDM

_PopAll        MACRO
        POP                DX
        POP                CX
        POP                BX
        POP                DI
        POP                SI
                ENDM
_start:
        MOV                AX,DATA
        MOV                DS,AX
        MOV                ES,AX

        XOR                AX,AX
        LEA                DI,count
        MOV                CX,256
_@1:
        INC                DI
        STOSB
        INC                AX
        LOOP        _@1

        CALL        _InputChar
        CALL        _Sort
        CALL        _Output

        MOV                AX,4C00H
        INT                21H

_Output        PROC
        _EnterLine
        MOV                AH,9
        LEA                DX,msg1
        INT                21H
        PUSH        count4Number
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg2
        INT                21H
        PUSH        count4Uletter
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg3
        INT                21H
        PUSH        count4Lletter
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg4
        INT                21H
        PUSH        count4Other
        CALL        _OutputByte
        _EnterLine

        MOV                CX,256
        LEA                SI,count
        XOR                BX,BX

_OutputLoop:
        LODSW
        TEST        AL,AL
        JE                _OutEnd
        CMP                AL,BL
        JE                _SameTimes

        MOV                BL,AL
        PUSH        AX
        _EnterLine

        PUSH        BX
        CALL        _OutputByte

        MOV                AH,9
        LEA                DX,msg5
        INT                21H
        POP                AX

        MOV                DL,AH
        MOV                AH,2
        INT                21H
        JMP                _@@1
_SameTimes:
        PUSH        AX
        MOV                AH,02
        MOV                DL,','
        INT                21H
        POP                AX
        MOV                DL,AH
        MOV                AH,2
        INT                21H
_@@1:
        LOOP        _OutputLoop
_OutEnd:
        RET
_Output        ENDP

_InputChar        PROC
        LEA                DI,count
        LEA                SI,count4number
        XOR                CX,CX
_@2:
        MOV                AH,1
        INT                21H
        CMP                AL,0DH
        JE                _@3

        ;小于32大于等于127的字符放弃(32是空格,126是~)
        CMP                AL,32
        JL                _@2
        CMP                AL,127
        JAE                _@2
        
        ;判断数字
        CMP                AL,'0'
        JL                _@4
        CMP                AL,'9'
        JG                _@5
        ;是数字
        INC                BYTE PTR [SI]
        JMP                _@7
_@5:
        ;判断大写字母
        CMP                AL,'A'
        JL                _@4
        CMP                AL,'Z'
        JG                _@6
        ;是大写字母
        INC                BYTE PTR [SI+2]
        JMP                _@7
_@6:
        ;判断小写字母
        CMP                AL,'a'
        JL                _@4
        CMP                AL,'z'
        JG                _@4
        ;是小写字母
        INC                BYTE PTR [SI+4]
        JMP                _@7
_@4:
        ;是其他字符
        INC                BYTE PTR [SI+6]
_@7:
        XOR                AH,AH
        SHL                AX,1
        MOV                BX,AX
        ;统计每个字符的出现次数
        INC                BYTE PTR [DI+BX]
        
        ;控制输入字符不超过255个
        INC                CX
        CMP                CX,255
        JGE                _@3
        JMP                _@2
_@3:
        RET
_InputChar        ENDP

;字符出现次数排序
_Sort        PROC
        LEA                DI,count
        MOV                CX,256
_outLoop:        
        PUSH        CX
        DEC                CX
        CMP                CX,1
        JE                _SortOver
        MOV                BX,CX
_innerLoop:
        PUSH        BX
        SUB                BX,CX
        SHL                BX,1
        MOV                AX,[DI+BX]
        CMP                AL,[DI+BX+2]
        JAE                _BigThan
        PUSH        [DI+BX+2]
        POP                [DI+BX]
        PUSH        AX
        POP                [DI+BX+2]
_BigThan:
        POP                BX
        LOOP        _innerLoop
        POP                CX
        LOOP        _outLoop
_SortOver:
        POP                CX
        RET
_Sort        ENDP

_OutputByte        PROC
        PUSH        BP
        MOV                BP,SP
        SUB                SP,4
        _PushAll

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

        MOV                CX,3
        MOV                AX,[BP+4]
_OBLoop:
        XOR                DX,DX
        DIV                WORD PTR [BP-4]
        XCHG        AX,DX
        TEST        DX,DX
        JNE                _OutputIt
        MOV                BX,[BP-2]
        TEST        BX,BX
        JE                _NoOutput
_OutputIt:
        PUSH        AX
        MOV                AH,02
        ADD                DL,030H
        INT                21H
        INC                WORD PTR [BP-2]
        POP                AX
_NoOutput:
        PUSH        AX
        XOR                DX,DX
        MOV                AX,[BP-4]
        MOV                BX,10
        DIV                BX
        MOV                [BP-4],AX
        POP                AX
        LOOP        _OBLoop

        MOV                AX,[BP-2]
        TEST        AX,AX
        JNE                _OBEnd
        MOV                AH,2
        MOV                DL,'0'
        INT                21H
_OBEnd:

        _PopAll
        ADD                SP,4
        MOV                SP,BP
        POP                BP
        RET                2
_OutputByte        ENDP

CODE        ENDS
END _start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

data segment
                count        DW        256        dup(0)
                count4Number        DW  0
                count4Uletter        DW  0
                count4Lletter   DW  0
                count4Other                DW        0

                msg1 db "number count:",36
                msg2 db "upcase letter count:",36
                msg3 db "lowcase letter count:",36
                msg4 db "other character count:",36
                msg5 db "  times appeared character:",36
data ends

code segment
_Break        MACRO
        NOP
        INT        1H
        NOP
                ENDM

_EnterLine        MACRO
        MOV                AH,02
        MOV                DL,0AH
        INT                21H
        MOV                DL,0DH
        INT                21H
                        ENDM

_PushAll        MACRO
        PUSH        SI
        PUSH    DI
        PUSH    BX
        PUSH    CX
        PUSH    DX
                        ENDM

_PopAll        MACRO
        POP                DX
        POP                CX
        POP                BX
        POP                DI
        POP                SI
                ENDM
_start:
        MOV                AX,DATA
        MOV                DS,AX
        MOV                ES,AX

        XOR                AX,AX
        LEA                DI,count
        MOV                CX,256
_@1:
        INC                DI
        STOSB
        INC                AX
        LOOP        _@1

        CALL        _InputChar
        CALL        _Sort
        CALL        _Output

        MOV                AX,4C00H
        INT                21H

_Output        PROC
        _EnterLine
        MOV                AH,9
        LEA                DX,msg1
        INT                21H
        PUSH        count4Number
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg2
        INT                21H
        PUSH        count4Uletter
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg3
        INT                21H
        PUSH        count4Lletter
        CALL        _OutputByte
        _EnterLine
        
        MOV                AH,9
        LEA                DX,msg4
        INT                21H
        PUSH        count4Other
        CALL        _OutputByte
        _EnterLine

        MOV                CX,256
        LEA                SI,count
        XOR                BX,BX

_OutputLoop:
        LODSW
        TEST        AL,AL
        JE                _OutEnd
        CMP                AL,BL
        JE                _SameTimes

        MOV                BL,AL
        PUSH        AX
        _EnterLine

        PUSH        BX
        CALL        _OutputByte

        MOV                AH,9
        LEA                DX,msg5
        INT                21H
        POP                AX

        MOV                DL,AH
        MOV                AH,2
        INT                21H
        JMP                _@@1
_SameTimes:
        PUSH        AX
        MOV                AH,02
        MOV                DL,','
        INT                21H
        POP                AX
        MOV                DL,AH
        MOV                AH,2
        INT                21H
_@@1:
        LOOP        _OutputLoop
_OutEnd:
        RET
_Output        ENDP

_InputChar        PROC
        LEA                DI,count
        LEA                SI,count4number
        XOR                CX,CX
_@2:
        MOV                AH,1
        INT                21H
        CMP                AL,0DH
        JE                _@3

        ;小于32大于等于127的字符放弃(32是空格,126是~)
        CMP                AL,32
        JL                _@2
        CMP                AL,127
        JAE                _@2
        
        ;判断数字
        CMP                AL,'0'
        JL                _@4
        CMP                AL,'9'
        JG                _@5
        ;是数字
        INC                BYTE PTR [SI]
        JMP                _@7
_@5:
        ;判断大写字母
        CMP                AL,'A'
        JL                _@4
        CMP                AL,'Z'
        JG                _@6
        ;是大写字母
        INC                BYTE PTR [SI+2]
        JMP                _@7
_@6:
        ;判断小写字母
        CMP                AL,'a'
        JL                _@4
        CMP                AL,'z'
        JG                _@4
        ;是小写字母
        INC                BYTE PTR [SI+4]
        JMP                _@7
_@4:
        ;是其他字符
        INC                BYTE PTR [SI+6]
_@7:
        XOR                AH,AH
        SHL                AX,1
        MOV                BX,AX
        ;统计每个字符的出现次数
        INC                BYTE PTR [DI+BX]
        
        ;控制输入字符不超过255个
        INC                CX
        CMP                CX,255
        JGE                _@3
        JMP                _@2
_@3:
        RET
_InputChar        ENDP

;字符出现次数排序
_Sort        PROC
        LEA                DI,count
        MOV                CX,256
_outLoop:        
        PUSH        CX
        DEC                CX
        CMP                CX,1
        JE                _SortOver
        MOV                BX,CX
_innerLoop:
        PUSH        BX
        SUB                BX,CX
        SHL                BX,1
        MOV                AX,[DI+BX]
        CMP                AL,[DI+BX+2]
        JAE                _BigThan
        PUSH        [DI+BX+2]
        POP                [DI+BX]
        PUSH        AX
        POP                [DI+BX+2]
_BigThan:
        POP                BX
        LOOP        _innerLoop
        POP                CX
        LOOP        _outLoop
_SortOver:
        POP                CX
        RET
_Sort        ENDP

_OutputByte        PROC
        PUSH        BP
        MOV                BP,SP
        SUB                SP,4
        _PushAll

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

        MOV                CX,3
        MOV                AX,[BP+4]
_OBLoop:
        XOR                DX,DX
        DIV                WORD PTR [BP-4]
        XCHG        AX,DX
        TEST        DX,DX
        JNE                _OutputIt
        MOV                BX,[BP-2]
        TEST        BX,BX
        JE                _NoOutput
_OutputIt:
        PUSH        AX
        MOV                AH,02
        ADD                DL,030H
        INT                21H
        INC                WORD PTR [BP-2]
        POP                AX
_NoOutput:
        PUSH        AX
        XOR                DX,DX
        MOV                AX,[BP-4]
        MOV                BX,10
        DIV                BX
        MOV                [BP-4],AX
        POP                AX
        LOOP        _OBLoop

        MOV                AX,[BP-2]
        TEST        AX,AX
        JNE                _OBEnd
        MOV                AH,2
        MOV                DL,'0'
        INT                21H
_OBEnd:

        _PopAll
        ADD                SP,4
        MOV                SP,BP
        POP                BP
        RET                2
_OutputByte        ENDP

CODE        ENDS
END _start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

无标题.jpg

不能输出中文,把提示信息都改了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-11-8 11:55:14 From FishC Mobile | 显示全部楼层
不能光看,要多写程序,哪怕照着别人的程序敲一遍也好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

ok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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