+ -
当前位置:首页 → 问答吧 → 有关字符串比较的问题

有关字符串比较的问题

时间:2011-06-03

来源:互联网

Assembly code
        DATA  SEGMENT
        STR1  DB        10,13,'match','$'
        STR2  DB        10,13,'No match','$'
        STR3  DB        10,13,'please input the first string:','$'
        STR4  DB        10,13,'please input the second string:','$'
     STR1_IN  DB        10,13,10 DUP(?)
     STR2_IN  DB        10,13,10 DUP(?)
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA

      START:  MOV       AX,DATA
              MOV       DS,AX
              MOV       ES,AX       ;加上这句,因为串比较时用到它
       
              MOV       DX,OFFSET STR3
              MOV       AH,09H
              INT       21H
       
              MOV       DX,OFFSET STR1_IN
              MOV       AH,0AH
              INT       21H
       
              MOV       DX,OFFSET STR4
              MOV       AH,09H
              INT       21H
              
              MOV       DX,OFFSET STR2_IN
              MOV       AH,0AH
              INT       21H
              MOV       CX,3
              LEA       SI,STR1_IN
              LEA       DI,STR2_IN
              CLD
                      REPZ  CMPSB
                        
              JZ        L2
              JNZ       L1
     
         L1:  MOV       DX,OFFSET STR2
              MOV       AH,09H
              INT       21H
              JMP       _END        ;加上这句,否则两种提示有可能都出现
         L2:  MOV       DX,OFFSET STR1
              MOV       AH,09H
              INT       21H
       _END:
              
              MOV       AH,4CH
              INT       21H
        CODE  ENDS
              END       START


为什么运行时,当输入诸如abc,ac或者11,12这样的数据时,也会判断为相同呢?
还有2个问题,程序中MOV CX,3是起什么作用的啊?为什么我将3改成其他数字,判断结果又会发生变化
还有如果我想让这个程序不退出,判断一组后继续判断,JMP START的代码应该加在哪里?
刚接触汇编,问题比较多,希望大家帮帮忙

作者: ryusonfrex   发布时间: 2011-06-03

第一个问题,因为在定义输入缓冲空间“STR1_IN” 和“STR2_IN”时,前面两个字节预先放置了“10,13“,这两个字节在从屏幕上取得输入数据后不会改变,因此,需要在设置si和di的初始值时,跳过它们,即在“LEA DI,STR2_IN”后加入“add si,2”和“add di,2”这两条语句。
第二个问题,“mov cx,3”是设置循环指令“repz”的循环次数的,即限制最长的串比较长度,如果你的输入超出了这个长度限制,则超出的部分不会进行串比较操作,即当cx设置为3时,输入“abcd”和“abcc”将被认为是相同的两个串。
第三个问题,如果想不停的循环执行多组串比较操作,则只需在“_END:”后加入语句“JMP START”即可
不知道是否解决了你的问题

作者: huyi0125   发布时间: 2011-06-03

多谢楼上,第二,三个问题比较清楚了
不过第一个问题,我在代码中加入add si,2和add di,2后会提示以下错误
Undefined symbol:SI,2
Argument needs type override

作者: ryusonfrex   发布时间: 2011-06-03

MOV CX,10

作者: leetow2003   发布时间: 2011-06-03

Assembly code
DATA  SEGMENT
        STR1  DB        10,13,'match','$'
        STR2  DB        10,13,'No match','$'
        STR3  DB        10,13,'please input the first string:','$'
        STR4  DB        10,13,'please input the second string:','$'
     STR1_IN  DB        10,13,10 DUP(?)
     STR2_IN  DB        10,13,10 DUP(?)
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA

      START:  MOV       AX,DATA
              MOV       DS,AX
              MOV       ES,AX       ;加上这句,因为串比较时用到它
       
              MOV       DX,OFFSET STR3
              MOV       AH,09H
              INT       21H
       
              MOV       DX,OFFSET STR1_IN
              MOV       AH,0AH
              INT       21H
       
              MOV       DX,OFFSET STR4
              MOV       AH,09H
              INT       21H
              
              MOV       DX,OFFSET STR2_IN
              MOV       AH,0AH
              INT       21H
              
              LEA       SI,STR1_IN
              LEA       DI,STR2_IN
              ADD       SI,2
              ADD       DI,2
              CLD
              MOV       CX,25
        REPZ  CMPSB
                        
              JZ        L2
              JNZ       L1
     
         L1:  MOV       DX,OFFSET STR2
              MOV       AH,09H
              INT       21H
              JMP       _END        ;加上这句,否则两种提示有可能都出现
         L2:  MOV       DX,OFFSET STR1
              MOV       AH,09H
              INT       21H
       _END:
              JMP       START
              MOV       AH,4CH
              INT       21H
        CODE  ENDS
              END       START


修改以后的代码。。。。不知道为什么,不管输入字符是否相同,全部判断为不相同了

作者: ryusonfrex   发布时间: 2011-06-03

MOV CX,10这句代码放置位置有讲究吗?
为什么我把25改成10之后,6组数据后,判断结果就开始出现异常了
而25的时候,所有判断结果均为不同

作者: ryusonfrex   发布时间: 2011-06-03


很奇怪的输出结果。。。费解啊

作者: ryusonfrex   发布时间: 2011-06-03

因为你的定义是:
STR1_IN DB 10,13,10 DUP(?)
STR2_IN DB 10,13,10 DUP(?)
所以mov cx,10
这句代码放置位置应该在REPZ CMPSB之前;
你应该想办法在把字符串存在STR1_IN和STR2_IN之前,把它们清0


作者: leetow2003   发布时间: 2011-06-03


同样的代码,这回又是4次后,判断结果出现异常,搞不懂了。。。。。。。

作者: ryusonfrex   发布时间: 2011-06-03

STR1_IN和STR2_IN清0

作者: leetow2003   发布时间: 2011-06-03

你把cx设为25后,已经超出了你预定义的“STR1_IN”大小了。我也是加了“add si,2”和“add di,2”,没有报你说的那个错误。
这是我的结果:
Microsoft Windows [???? 6.1.7600]
???????? (c) 2009 Microsoft Corporation????????????????

C:\Users\Administrator>cd ..\..\MASM

C:\MASM>test.exe

please input the first string:1
please input the second string:1
match
please input the first string:ab
please input the second string:ab
match
please input the first string:abc
please input the second string:abc
match
please input the first string:aa
please input the second string:ab
No match
please input the first string:abc
please input the second string:ab
No match
please input the first string:a
please input the second string:ab
No match
please input the first string:abcd
please input the second string:abcd
match
please input the first string:abcd
please input the second string:abcc
No match
please input the first string:

我修改后的源代码如下:
DATA SEGMENT

  STR1 DB 10,13,'match','$'
  STR2 DB 10,13,'No match','$'
  STR3 DB 10,13,'please input the first string:','$'
  STR4 DB 10,13,'please input the second string:','$'
  STR1_IN DB 10,13,10 DUP(?)
  STR2_IN DB 10,13,10 DUP(?)
  DATA ENDS
  CODE SEGMENT
  ASSUME CS:CODE,DS:DATA

  START: MOV AX,DATA
  MOV DS,AX
  MOV ES,AX ;加上这句,因为串比较时用到它
   
  MOV DX,OFFSET STR3
  MOV AH,09H
  INT 21H
   
  MOV DX,OFFSET STR1_IN
  MOV AH,0AH
  INT 21H
   
  MOV DX,OFFSET STR4
  MOV AH,09H
  INT 21H
   
  MOV DX,OFFSET STR2_IN
  MOV AH,0AH
  INT 21H
  MOV CX,4;///////////////////////////////////我把cx修改为4,但这不影响程序的流程,只是让限制长度变为4字节
  LEA SI,STR1_IN
  add si, 2;//////////////////////////////si+2,跳过“10,13”
  LEA DI,STR2_IN
  add di, 2;//////////////////////////////di+2,跳过“10,13”
  CLD
  REPZ CMPSB
   
  JZ L2
  JNZ L1
   
  L1: MOV DX,OFFSET STR2
  MOV AH,09H
  INT 21H
  JMP _END ;加上这句,否则两种提示有可能都出现
  L2: MOV DX,OFFSET STR1
  MOV AH,09H
  INT 21H
  _END:
  jmp START;//////////////////////////////////实现不停的循环比较
  MOV AH,4CH
  INT 21H
  CODE ENDS
  END START

作者: huyi0125   发布时间: 2011-06-03

引用 9 楼 leetow2003 的回复:

STR1_IN和STR2_IN清0

9楼说得很对,需要将原来存储的数据清0

作者: huyi0125   发布时间: 2011-06-03

引用 9 楼 leetow2003 的回复:
STR1_IN和STR2_IN清0

刚接触汇编,不是太清楚,只知道寄存器清零方法,如何将这2个变量清零?
STR1_IN DB 10,13,10 DUP(0)
STR2_IN DB 10,13,10 DUP(0)
这样试了貌似也不行。。。。

作者: ryusonfrex   发布时间: 2011-06-03