汇编语言删除重复字母的问题
stacksgsegmentstack's';1dw64dup('st');2stacksgends;3datasegment;4bufferdb60,?,60dup(?...
stacksg segment stack 's' ;1
dw 64 dup('st') ;2
stacksg ends ;3
data segment ;4
buffer db 60,?,60 dup(?) ;输入缓冲区
print db 'to input:','$' ;要输出提示信息
crlf db 0dh,0ah,'$'
count db ?
data ends
code segment
assume cs:code,ds:data,ss:stacksg
main proc far ;该过程为远程型.可以在段内被调用,也可以在段间被调用
mov ax,data
mov ds,ax
mov es,ax
push ds
pop es
mov ah,9 ;输出一串提示信息 “mov ah,9 ”是调用int 21h 的功能号
lea dx,print ;lea 传送有效地址指令,把原操作数的有效地址送给指定的寄存器
int 21h
mov ah,0ah ;输入一串字符
lea dx,buffer
int 21h
mov ah,9 ;输出回车换行符,以使光标停在新行首
lea dx,crlf
int 21h
mov cl,buffer+1 ;取接收到的字符个数在cx中
xor ch,ch
mov count,cl
mov si,buffer+3 ;将输入的第一个字符送给si寄存器
mov di,buffer+2 ;将输入的第一个字符送给si寄存器
loop2: cmp [di],[si] ;对比第一个字符和后面的字符是否相等 (37行)
jz act1 ;若相等,执行 act1
inc si ;不相等,si+1
loop loop2 ;循环
loop1: inc di
cmp di,buffer+count
jne loop1
act1: mov [si],0 ;将和前面字符相等的字符置为0
inc si
mov ah,2
loop3: cmp byte ptr [si],0
je no_copy
mov dl,[si]
int 21h
inc si
loop loop3
no_copy: inc bx
mov ax,4c00h
int 21h
main endp
code ends
end main
我的方法是循环将重复的字母置为0,然后删除0再显示。
我知道si di 存储器的比较那里有问题。。但还是不知道怎么改。。求指教。 展开
dw 64 dup('st') ;2
stacksg ends ;3
data segment ;4
buffer db 60,?,60 dup(?) ;输入缓冲区
print db 'to input:','$' ;要输出提示信息
crlf db 0dh,0ah,'$'
count db ?
data ends
code segment
assume cs:code,ds:data,ss:stacksg
main proc far ;该过程为远程型.可以在段内被调用,也可以在段间被调用
mov ax,data
mov ds,ax
mov es,ax
push ds
pop es
mov ah,9 ;输出一串提示信息 “mov ah,9 ”是调用int 21h 的功能号
lea dx,print ;lea 传送有效地址指令,把原操作数的有效地址送给指定的寄存器
int 21h
mov ah,0ah ;输入一串字符
lea dx,buffer
int 21h
mov ah,9 ;输出回车换行符,以使光标停在新行首
lea dx,crlf
int 21h
mov cl,buffer+1 ;取接收到的字符个数在cx中
xor ch,ch
mov count,cl
mov si,buffer+3 ;将输入的第一个字符送给si寄存器
mov di,buffer+2 ;将输入的第一个字符送给si寄存器
loop2: cmp [di],[si] ;对比第一个字符和后面的字符是否相等 (37行)
jz act1 ;若相等,执行 act1
inc si ;不相等,si+1
loop loop2 ;循环
loop1: inc di
cmp di,buffer+count
jne loop1
act1: mov [si],0 ;将和前面字符相等的字符置为0
inc si
mov ah,2
loop3: cmp byte ptr [si],0
je no_copy
mov dl,[si]
int 21h
inc si
loop loop3
no_copy: inc bx
mov ax,4c00h
int 21h
main endp
code ends
end main
我的方法是循环将重复的字母置为0,然后删除0再显示。
我知道si di 存储器的比较那里有问题。。但还是不知道怎么改。。求指教。 展开
1个回答
展开全部
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
BUFFER DB 60, ?, 60 DUP(?)
PRINT DB 'TO INPUT: '
CRLF DB 0DH, 0AH, '$'
DATA ENDS
CODE SEGMENT
MAIN:
MOV AX, DATA
MOV DS, AX
MOV AH, 9
LEA DX, PRINT
INT 21H
MOV AH, 0AH
LEA DX, BUFFER
INT 21H
MOV AH, 9
LEA DX, CRLF
INT 21H
LEA SI, BUFFER + 1
LP1:
INC SI
LP2:
MOV AL, [SI]
CMP AL, 13
JZ DISP
CMP AL, [SI + 1]
JNZ LP1
MOV DI, SI
LP3:
INC DI
MOV AL, [DI + 1]
MOV [DI], AL
CMP AL, 13
JZ LP2
JMP LP3
DISP:
MOV AL, '$'
MOV [SI], AL
MOV AH, 9
LEA DX, BUFFER + 2
INT 21H
EXIT:
MOV AX, 4C00H
INT 21H
CODE ENDS
END MAIN
更多追问追答
追问
输出是错误的:
input:adcbaadbs
输出的话就是 adcbadbs
也就是说只能删除一个字符。
追答
没有错。
我删除的是:连续出现的字符。
不连续的、间隔出现的字符,不予理会。
关键是,题目要求,有歧义。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询