| 
 | 
 
 
发表于 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
 
  复制代码 |   
 
 
 
 |