DATA SEGMENT
STRN DB 80 DUP(?)
LEN DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,STRN
MOV CL,0
AGAIN:MOV AH,1 ;輸入字符
INT 21H
CMP AL,0DH ;字符是否是回車
JZ DONE ;是,跳轉DONE
MOV [SI],AL ;否,將AL中內容傳送到SI所指向存盤單元
INC SI
INC CL ;記錄字符個數
JMP AGAIN
DONE: MOV CH,0 ;CX存放字符數
MOV LEN,CL ; 將CL中內容傳送到LEN
DEC SI
REPET: PUSH SI
PUSH CX ;保存CX,CX內回圈記數
PUSH CX ;將CX值傳送給DX,DX外回圈記數
POP DX
DEC CX
JE NEXT1 ;是最后一個字符,不再查找重復字符
MOV AL,[SI]
CMP AL,0
JE NEXT1
COMP: DEC SI
CMP AL,[SI]
JNE GOON ;不相等,為非重復字符
MOV BYTE PTR[SI],0
GOON: LOOP COMP ;查出與該字符重復的所有字符,并用0替換
NEXT1: POP DX
POP SI
DEC SI
DEC DX
MOV CX,DX
JNZ REPET ;對所有重復字符都進行查找
LEA SI,STRN ;洗掉重復字符
MOV CL,LEN
MOV CH,0
MOV [SI+LEN-1],'$'
INC CL
CYCLE: MOV AL,[SI]
CMP AL,0 ;是重復字符嗎?
JNZ NEXT ;不是,查找下一個字符
DEC CX ;遞補字串長度送CX
JZ DONE1 ;若是最后字符不遞補
CALL DELE ;洗掉該空字符并遞補
DEC SI ;對遞補子串從頭處理
INC CX
NEXT: INC SI
LOOP CYCLE
DONE1: MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
LEA DX,STRN
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
DELE PROC
PUSH SI
PUSH CX
CLD
MOV DI,SI ;空字符處為目的首址
INC SI
REP MOVSB ;下一個地址為源串首址
POP CX
POP SI
RET
DELE ENDP
CODE ENDS
END START
uj5u.com熱心網友回復:
不能夠有系統思維方法?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/46688.html
標籤:匯編語言
