|
![]() | 作者: 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号