|------------ | 每个大矩形的前面连个小矩形分别表示缓冲区的前两个字节,懂汇编的都知道这两个个字节的用途。
现在目的是把字符串B中的A串用C来替换(A,C不等长,三个字符串需从键盘输入),我的思路是这样的:1.现在B中查找A所在的位置,2,此时DI已指向B2开头(因为REPZ CMPSB指令),将B2暂时移到A区中,然后把C串移到B中原A的位置(即B1末尾),3.(将DI后退一格,以便将C末尾的字符串结束符覆盖掉)把B2添加到B中的C后面,4.输出替换操作后的B串,下面是我写的代码,有问题但是我找不出来,(可能是执行REPZ指令前CX没有设置好,但是这个我不懂)请高手指点:
DATA SEGMENT
BUFFERA DB 32
DB 0
DB 32 DUP(0)
BUFFERB DB 81
DB 0
DB 81 DUP(0)
BUFFERC DB 32
DB 0
DB 32 DUP(0)
PROMPTSTRINGA DB 'input A string:',0AH,0DH,'$'
PROMPTSTRINGB DB 'input B string:',0AH,0DH,'$'
PROMPTSTRINGC DB 'input c string to replace A string:',0AH,0DH,'$'
PROMPTSTRINGENTER DB 0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
;input A B string
MOV DX,DATA
MOV DS,DX
MOV DX,OFFSET PROMPTSTRINGA
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERA
MOV DS,DX
MOV DX,OFFSET BUFFERA
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV DX,OFFSET PROMPTSTRINGB
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERB
MOV ES,DX
MOV DX,OFFSET BUFFERB
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV DX,OFFSET PROMPTSTRINGC
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERC
MOV DS,DX
MOV DX,OFFSET BUFFERC
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER
MOV AH,09H
INT 21H
;look for if A in B
MOV SI,OFFSET BUFFERA
MOV DI,OFFSET BUFFERB
ADD SI,02H
ADD DI,01H
PUSH SI
PUSH DI
;MOV BX,ES:[DI] ;BL记录DI中的串长
;MOV BH,00H
MOV CX,DS:[SI-01H] ;BL记录SI中的串长
MOV CH,00H
PUSH CX
AGAIN:
POP CX
POP DI
INC DI
POP SI
PUSH SI
PUSH DI
PUSH CX
REPZ CMPSB
CMP CX,0
JZ EXCHANGE ;
JMP AGAIN
EXCHANGE: MOV SI,DI
MOV DI,OFFSET BUFFERA
ADD DI,02H
POP CX
MOV CX,[DI-1] ;获得A字符个数
PUSH CX
ADD SI,CX
CLD
REPZ MOVSB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP CX
POP DI
MOV SI,OFFSET BUFFERC
ADD SI,02H
REPZ MOVSB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUB DI,01H ;将DI回退一格,以便可以覆盖掉C串末尾的结束符
MOV SI,OFFSET BUFFERA
ADD SI,02H
REPZ MOVSB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEWB: MOV DX,OFFSET BUFFERB
ADD DX,02H
MOV AH,09H
INT 21H
ENDPRO: MOV AH,4CH
INT 21H
CODE ENDS
END START
如果能够解决的话会追加悬赏