21,500
社区成员
发帖
与我相关
我的任务
分享BUFFER_LENGTH EQU 80 ; 缓冲区长度
DATA SEGMENT
NewLine DB 0AH, 0DH, '$'
InputBuffer DB BUFFER_LENGTH, ?, BUFFER_LENGTH DUP(?)
OutputBuffer DB BUFFER_LENGTH DUP(?), ?
Chars DB 100H DUP(0) ; 按顺序储存哪些字符出现的次数最多
RepeatCount DW 0 ; 储存重复次数
LastChar DB 0 ; 储存前一个字符
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
Start:
mov ax, DATA ; 初始化
mov ds, ax
mov es, ax
cld
mov ah, 0AH ; 输入字符串
lea dx, InputBuffer
int 21H
lea si, InputBuffer[1] ; 取缓冲区地址
lea di, Chars ; 取字符数组地址
lodsb ; 取字符串长度
inc ax ; 把最后的0DH也算在内,作为结尾
xor ah, ah
mov cx, ax ; 循环次数
xor dx, dx ; 记录当前字符重复次数
Lp:
lodsb ; 取字符
cmp al, LastChar ; 与前一字符比较
jz Next ; 相同则跳转
xchg al, LastChar ; 取出并更新前一字符
mov bx, dx ; 取出最大重复次数
xor dx, dx ; 重新计数
cmp bx, RepeatCount ; 比较最大重复次数
jc Next ; 小于当前最大重复次数则跳转
jz Equal ; 等于则跳转
mov RepeatCount, bx ; 更新最大重复次数
lea di, Chars ; 重置di
Equal:
stosb
Next:
inc dx ; 增加计数
loop Lp
mov ah, 9
lea dx, NewLine
int 21H
lea si, Chars ; 取字符数组地址
Print:
cmp si, di
jz Exit
mov cx, RepeatCount ; 取重复次数
lodsb ; 取字符
mov dl, al
PrintChar:
mov ah, 2 ; 显示字符
int 21H
loop PrintChar
jmp Print
Exit:
mov ah, 4CH
int 21H
CODE ENDS
END StartDATA SEGMENT
BUF DB 10
DB ?
DB 10 DUP(?)
BUF1 DB 10 DUP(0)
INPUT DB 0AH,0DH,'PLEASE INPUT:',0AH,0DH
DB 'IF YOU WANT TO QUIT,PRESS Q OR q',0AH,0DH,'$'
BUF2 DB 100 DUP(0)
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT 'code'
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
LEA DX,INPUT
MOV AH,9h
INT 21H
mov ah,08h ;按Q/q退出
int 21h
cmp al,'Q'
je exit
cmp al,'q'
je exit
LEA DX,BUF
MOV AH,0AH
INT 21H
MOV CX,-2 ;计算BUF里面有效字符长度
LEA SI,BUF
COUNT1:INC CX
INC SI
CMP BYTE PTR [SI],0DH
JNZ COUNT1
PUSH CX
LEA SI,BUF+2 ;统计BUF里面连续字符数目,放到BUF1对应的每个位置里面
LEA DI,BUF1
MOV AX,SI
MOV BX,DI
INC BYTE PTR [DI]
LOOPA:MOV DL,[SI]
INC SI
CMP DL,[SI]
JZ A
PUSH SI
PUSH BX
SUB SI,AX
ADD BX,SI
MOV DI,BX
POP BX
POP SI
A:INC BYTE PTR [DI]
LOOP LOOPA
PUSH CX ;将BUF1里面的最大数找出,放入AL中
LEA DI,BUF1
MOV AL,[DI]
DEC CX
A1:INC DI
CMP AL,[DI]
JG A2
MOV AL,[DI]
A2:LOOP A1
POP CX
LEA BX,BUF ;将与BUF1里面最大数相同的数找到,并输出与BUF相同位置的字符,输出AL次
LEA DI,BUF1
LEA SI,BUF2
MOV AH,AL
MOV AL,0
A3:CMP AH,[DI]
JNZ D
MOV DL,AH
PUSH SI
A4:PUSH AX
MOV AH,0
ADD SI,WORD PTR AX
POP AX
MOV BH,BYTE PTR [BX]
MOV BYTE PTR [SI],BH
INC SI
DEC DL
JNZ A4
D:INC DI
INC AL
POP SI
LOOP A3
MOV BYTE PTR [SI],'$'
LEA DX,BUF2
MOV AH,9
INT 21H
EXIT:MOV AX,4C00H
INT 21H
CODE ENDS
END START