论坛: 编程破解 标题: 286我遇到难题了 复制本贴地址    
作者: mingren123 [mingren123]    论坛用户   登录
要求比较两个字符串string1和string2所含字符串是否相同,若相同显示'MATCH',不同显示'NO MATCH'
现在问题 不管相同是否 都显示一样的结果???????????????
data segment
string1 db '12345678990$'
print1 db 'match$'
print2 db 'NO match$'
data ends
extra segment
string2 db '1234567890$'
extra ends
code segment
assume ds:data,es:extra,cs:code
start:
mov ax,data
mov ds,ax
lea si,string1
mov ax,extra
mov es,ax
lea di,string2
cld
repe cmps string1,string2
jne print
lea dx,print1
mov ah,9
int 21h
mov ax,4cffh
int 21h
print:
lea dx,print2
mov ah,9
int 21h
mov ax,4cffh
int 21h
code ends
end start


[此贴被 mingren123(mingren123) 在 05月12日19时43分 编辑过]


[此贴被 mingren123(mingren123) 在 05月13日08时34分 编辑过]

地主 发表时间: 05-05-12 19:42

回复: wxngzybb [wxngzybb]   论坛用户   登录
你的代码这里
repe cmps string1,string2
jne print
lea dx,print1
mov ah,9
int 21h
print:
lea dx,print2
mov ah,9
int 21h
mov ax,4cffh
int 21h
code ends

print之前为什么不退出dos呢?我想你总会得到no match的显示
还有:repe cmps string1,string2
cmps后接string1 string2不对,应该用cmpsb表示比较的是字节字符串
前边的repe代表当zf置位或者ecx为0就停止cmps,这样看来你的程序在这里也是好像主动只想显示相等match的结果,可是后边的代码却是总显示no match的结构。repe应该不要

B1层 发表时间: 05-05-13 03:13

回复: mingren123 [mingren123]   论坛用户   登录
不好意思 漏抄一段了  PRINT 之前是有退DOS的 
还有 REPE 这个不能省吧??? 我把它省掉程序结果也还是一样的?????

[此贴被 mingren123(mingren123) 在 05月13日08时44分 编辑过]

B2层 发表时间: 05-05-13 08:33

回复: 286 [unique]   版主   登录
你少考虑了一个重要因素。就是比较字符的个数。没有这个个数限制,他就会用当前的CX值不停地往下比,直到找不到同,或CX为零。所以应该设CX的个数。
修改如下:

data segment
string1 db '1234567890$'
strlen equ $-string1  <------------------加上一个个数记数
print1 db 'match$'
print2 db 'NO match$'
data ends
extra segment
string2 db '1234567890$'
extra ends
code segment
assume ds:data,es:extra,cs:code
start:
mov ax,data
mov ds,ax
lea si,string1
mov ax,extra
mov es,ax
lea di,string2
mov cx,strlen    <--------赋值于此。
cld
repe cmps string1,string2
jne print
lea dx,print1
mov ah,9
int 21h
mov ax,4cffh
int 21h
print:
lea dx,print2
mov ah,9
int 21h
mov ax,4cffh
int 21h
code ends
end start


B3层 发表时间: 05-05-13 09:25

回复: wxngzybb [wxngzybb]   论坛用户   登录


mov esi, offset string1
mov edi, offset srting2
cld
xor ecx,ecx
mov ecx,sizeof string1
repe cmpsb
(or repe cmps byte ptr es:[edi],ds:[esi])
;check ecx for confluence selection
cmp ecx,0
je printmatch

lea dx,print2
mov ah,9
int 21h
mov ax,4cffh
int 21h
...
(exit dos)
printmatch:
lea dx,print1
mov ah,9
int 21h
mov ax,4cffh
int 21h

end start

impotantly, repe will stop in two cases: 1.zf=0 when finding mismatching byte pairs,2:ecx=0 when there is on longer byte for comparation. so check ecx for final result!






B4层 发表时间: 05-05-13 15:20

回复: mingren123 [mingren123]   论坛用户   登录
请问 这句 是什么意思  strlen equ $-string1 
$ 代表该指令的首地址  STRING1 是这个字符串的长度


B5层 发表时间: 05-05-13 16:13

回复: wxngzybb [wxngzybb]   论坛用户   登录
286用这个计算的string1 的字节数
相当于sizeof string1 或 lenthof string1 因为都是字节

$代表当前有效地址(相对于0(段首地址)而言的)

B6层 发表时间: 05-05-14 00:54

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号