汇编语言删除重复字母的问题

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 存储器的比较那里有问题。。但还是不知道怎么改。。求指教。
展开
 我来答
做而论道
高能答主

2015-10-30 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.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

也就是说只能删除一个字符。
追答
没有错。
我删除的是:连续出现的字符。

不连续的、间隔出现的字符,不予理会。

关键是,题目要求,有歧义。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式