当前位置: 代码迷 >> 汇编语言 >> 急求汇编高手,这么一个简单的字符串匹配如何就不对了
  详细解决方案

急求汇编高手,这么一个简单的字符串匹配如何就不对了

热度:5669   发布时间:2013-02-26 00:00:00.0
急求汇编高手,这么一个简单的字符串匹配怎么就不对了
哪位同学帮帮忙,我要输入两个字符串1和2,判断2是否为1的字串,是则输出YES,否则输出NO,以下是代码,但是不知道为什么总是NO,算法应该对吧,就是最简单的挨个字符匹配,不是KMP算法,哪里有错,请高人指点

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;声明:字符串匹配算法为脑残算法,不是KMP算法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定义数据段

DSEG SEGMENT 
LIST1 DB 50
  DB ?
  DB 50 DUP (?)
LIST2 DB 50
  DB ?
  DB 50 DUP (?)

MSG1 DB 'input list1:$'
MSG2 DB 'input list2:$'
  NEW_LINE DB 0DH,0AH,'$'
RESULT1 DB 'YES$'
RESULT2 DB 'NO$'
DSEG ENDS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定义代码段
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG

START:
MOV AX,DSEG
MOV DS,AX

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;输出MSG1,并输入字符串1
MOV DX,OFFSET MSG1
MOV AH,9
INT 21H

MOV DX,OFFSET LIST1
MOV AH,0AH
INT 21H
CALL NEWLINE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;输出MSG2,并输入字符串2
  MOV DX,OFFSET MSG2
MOV AH,9
INT 21H

MOV DX,OFFSET LIST2
MOV AH,0AH
INT 21H
CALL NEWLINE


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;获得字符串1的长度, MOV AL,LIST1+1
MOV AH,0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;否则进入循环比较区
MOV SI,OFFSET LIST1+1
NEXT1:
INC SI  
MOV CL,LIST2+1
MOV CH,0
;;获得字符串1的长度,若串1的长度小于串2的长度,就直接跳到最后
CMP AL,CL
JL HAHA
DEC AL
MOV BX,SI  
  MOV DI,OFFSET LIST2+2  
NEXT2: 
MOV DX,DS:[BX]  
CMP DX,DS:[DI]  
JNE NEXT1  
INC DI
INC BX 
LOOP NEXT2  

MOV DX,1  
JMP LAST1
HAHA: MOV DX,0  

LAST1: 
CMP DX,1
JNE JIEGUO1
MOV DX,OFFSET RESULT1
MOV AH,9
INT 21H
JMP JIEGUO2
JIEGUO1:
MOV DX,OFFSET RESULT2
MOV AH,9
INT 21H
JIEGUO2:
MOV AH,4CH
INT 21H
NEWLINE PROC 
  LEA DX,NEW_LINE
  MOV AH,9
INT 21H
RET
NEWLINE ENDP
CSEG ENDS
END START

------解决方案--------------------------------------------------------
NEXT2: 
MOV DX,DS:[BX]
CMP DX,DS:[DI] 
把上面的dx改成dl就好了,如下:
NEXT2: 
MOV Dl,DS:[BX]
CMP Dl,DS:[DI]

因为你cl和al中保存的是字符的个数,是以BYTE为单位的,所以只有能以byte为单位做比较 

上面我说错了,在int21 0ah,它返回的输入的字符个数中,是不包括回车,所以不需要减了
  相关解决方案