注册 登录
编程论坛 汇编论坛

比较两个字符串的程序,出错了

汪洋 发布于 2006-05-05 23:14, 1575 次点击
我要实现的功能是比较两个字符串STR1和STR2,相同则输出"MATCH",不同则输出"NO
MATCH".编译能通过,但结果不对,有乱码。

DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV CX,7
LEA SI,STR1
MOV DI,OFFSET STR2
REP CMPSB
JNZ NOMATCH
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS

17 回复
#2
汪洋2006-05-05 23:29

恳请各位大哥大姐,小弟小妹帮帮忙,我的作业快要完成不了了。

#3
汪洋2006-05-05 23:30
就这么忍心看着我自杀流涕吗?
#4
lj_8606032006-05-06 09:26
呵呵``别哭呀.我想你应该用LOOP循环来做.START那段代码我看有问题.帮你改改吧.
#5
lj_8606032006-05-06 09:47
以下是引用汪洋在2006-5-5 23:14:00的发言:
我要实现的功能是比较两个字符串STR1和STR2,相同则输出"MATCH",不同则输出"NO
MATCH".编译能通过,但结果不对,有乱码。

DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV CX,7
LEA SI,STR1
MOV DI,OFFSET STR2
DEC SI
DEC DI
LOP:
INC SI
INC DI
CMP [SI],[DI]
JNZ NOMATCH
LOOP LOP
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS

没调试因为我没有编译器,不知道对不对.

#6
汪洋2006-05-06 10:07

多谢大侠拔刀相助。
我把昨天的程序改了一下,改成了下面这个样子,可输出结果还是一样。

DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV SI,OFFSET STR1
MOV DI,OFFSET STR2
MOV CX,07H
CLD

REPZ CMPSB
JNZ NOMATCH
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS
END START

#7
汪洋2006-05-06 10:12

难不成我们的帖子是同时发上去的?哈哈,我正在为这题烦呢。谢谢,我再仔细研究研究。

#8
汪洋2006-05-06 10:13
我马上就调试。
#9
汪洋2006-05-06 10:34

太好了!我在你的基础上再做了一点改动就对了。
谢谢,下面是最后的代码。
DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV CX,7
MOV SI,OFFSET STR1
MOV DI,OFFSET STR2
LOP:
CMPSB
JNZ NOMATCH
LOOP LOP
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS
END START

#10
汪洋2006-05-06 10:39
对了,刚才编译你给我的代码的时候,编译器说 CMP [SI],[DI] 这一句有错,好像是因为操作数的类型不对,我英文不好,也不知道这是什么原因。
#11
汪洋2006-05-06 10:49
看了你的程序后,我把刚才的程序加上(MOV AX,DATA MOV DS,AX)就也正确了。
但为什么非要这两句?不是在ASSUME语句中已经给DS分配了吗?

DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET STR1
MOV DI,OFFSET STR2
MOV CX,07H
CLD
REPZ CMPSB
JNZ NOMATCH
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS
END START
#12
ttzz82006-05-06 14:28

看了LZ的两张萜子,MS你都是因为没有加这两句
MOV AX,DATA
MOV DS,AX

才导致出项乱码的啊 !!!!
除了一个寄存器(具体我也记不太清楚了,现在书也没带回家不过这个寄存器也用的不多的好象跟栈有关),它的对应的段地址是所在的寄存器是SS,其他我们常用的寄存器所对应的段地址所在的寄存器是DS,所以是一定要加滴!

#13
汪洋2006-05-06 15:16
多谢解惑!
楼上是说SP的段地址在SS吧?
但ASSUME语句的作用又是什么呢?
#14
ttzz82006-05-06 22:30

饿~~~~好象是的!
不过ASSUME具体是干吗的我也不太清楚了!不好意思!

#15
ttzz82006-05-06 22:36
https://www.bc-cn.net/bbs/dispbbs.asp?boardID=126&ID=55414&page=1
看看这个连接,那个公子解释了下.呵呵!!本人不才,只能靠别人!不要笑哈!
#16
汪洋2006-05-07 09:59
这个问题公子吕也给我解答过,
但我还是没大弄明白:理解能力实在低下@#¥
好了,我不能在这个问题上再给大家添麻烦了。
谢谢各位的帮助
#17
xiaoping6222006-06-02 23:17

看看这个,可能能帮助你!
data segment
sting1 db 'people'
sting2 db 'person'
buf1 db 'match$'
buf2 db 'no match$'
n equ $-sting1
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax

mov si,offset sting1
mov di,offset sting2
mov cx,n
cld
repe cmps
cmp cx,0
jz equ1
mov dx,offset buf2
jmp next

equ1:mov dx,offset buf1
next:mov ah,09h
int 21h

mov ah,4ch
int 21h

code ends
end start

#18
xiaoping6222006-06-25 16:21
DATA SEGMENT
TONG DB 'MATCH$'
BUTG DB 'NO MATCH$'
STR1 DB 'STRING1'
STR2 DB 'STRING2'
DATA ENDS


CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET STR1
MOV DI,OFFSET STR2
MOV CX,07H
CLD
REPZ CMPSB
JNZ NOMATCH
MATCH:
MOV DX,OFFSET TONG
MOV AH,09H
INT 21H
JMP OK
NOMATCH:
MOV DX,OFFSET BUTG
MOV AH,09H
INT 21H
OK:
MOV AH,4CH
INT 21H
RET
CODE ENDS
END START
当;str1 与 str2 相同时,好像比较不出来啊!我试过了,不知道你们试了没有........
1