汇编:统计出现的次数
输入一行字符,
统计 数字、大写字母、小写字母 及其它字符的出现频率。
进而分别统计每个数字、字母的出现频率。
并按出现频率的高低 从高到低 将其输出。
比如,输入:23*/\aaaaCCBBBBBB5555
输出结果:
数字的出现次数为:6
大写字母的出现次数为:8
小写字母的出现次数为:4
其它字符的出现次数为:3
出现六次的字符有:B
出现四次的字符有:a 5
出现两次的字符有:C
出现一次的字符有:2 3 本帖最后由 xieglt 于 2020-11-7 23:02 编辑
assume cs:code,ds:data
data segment
count DW 256 dup(0)
count4Number DW0
count4Uletter DW0
count4Lletter DW0
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
JMP _@7
_@5:
;判断大写字母
CMP AL,'A'
JL _@4
CMP AL,'Z'
JG _@6
;是大写字母
INC BYTE PTR
JMP _@7
_@6:
;判断小写字母
CMP AL,'a'
JL _@4
CMP AL,'z'
JG _@4
;是小写字母
INC BYTE PTR
JMP _@7
_@4:
;是其他字符
INC BYTE PTR
_@7:
XOR AH,AH
SHL AX,1
MOV BX,AX
;统计每个字符的出现次数
INC BYTE PTR
;控制输入字符不超过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,
CMP AL,
JAE _BigThan
PUSH
POP
PUSH AX
POP
_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 ,0
MOV WORD PTR ,100
MOV CX,3
MOV AX,
_OBLoop:
XOR DX,DX
DIV WORD PTR
XCHG AX,DX
TEST DX,DX
JNE _OutputIt
MOV BX,
TEST BX,BX
JE _NoOutput
_OutputIt:
PUSH AX
MOV AH,02
ADD DL,030H
INT 21H
INC WORD PTR
POP AX
_NoOutput:
PUSH AX
XOR DX,DX
MOV AX,
MOV BX,10
DIV BX
MOV ,AX
POP AX
LOOP _OBLoop
MOV AX,
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 本帖最后由 xieglt 于 2020-11-7 22:50 编辑
不能输出中文,把提示信息都改了.
xieglt 发表于 2020-11-7 22:48
不能输出中文,把提示信息都改了.
感谢,就是我现在在看小甲鱼的从零开始学汇编,总共77集,然后现在我看到50集了,但是我对于这样的题目还是无从下手。所以我问一下,要看到多少集,才能写出这个程序,还是说看完也写不出来,需要另外学东西 不能光看,要多写程序,哪怕照着别人的程序敲一遍也好。 xieglt 发表于 2020-11-8 11:55
不能光看,要多写程序,哪怕照着别人的程序敲一遍也好。
ok
页:
[1]