如何比较汇编中的两个字符串?

时间:2014-11-09 19:32:27

标签: string assembly intel x86-16

我是装配新手。我想用“cmps”来比较两个字符串。我读了一些例子,我写了这个:

GETSTR MACRO STR
   MOV AH,0AH
   LEA DX,STR
   INT 21H
ENDM

PRINTSTR MACRO STR
   MOV AH,09H
   LEA DX,STR
   INT 21H
ENDM


EXTRA SEGMENT
   DEST DB ?
EXTRA ENDS

DATA SEGMENT
    SOURCE DB ?
    STR1 DB 0AH,0DH,'ENTER STR  : ' ,'$'
    ENTER DB 10,13,'$'
    SAME  DB 0AH,0DH,'TWO STR ARE THE SAME   ' ,'$'
    NSAME DB 0AH,0DH,'TWO STR ARE NOT THE SAME   ' ,'$'

     USER  DB 6,10 DUP('$')
     USER1 DB 6,10 DUP('$')
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE,ES:EXTRA
START:
    MOV AX,DATA
    MOV DS,AX
    MOV AX,EXTRA
    MOV ES,AX

    PRINTSTR STR1
    GETSTR USER1

    PRINTSTR STR1
    GETSTR USER

    LEA BX,USER
    MOV SI,BX

    LEA BX,USER1
    MOV DI,BX

    CLD
    MOV CX,5
REPE CMPSB
    JCXZ MTCH
    PRINTSTR NSAME
    JMP ENDPR

MTCH:   
    PRINTSTR SAME
ENDPR:
    MOV AH,4CH
    INT 21H

 CODE ENDS
 END START

我有一些问题:

  1. 下面代码中的数字6,10究竟是什么:

    USER DB 6,10 DUP('$')
    
  2. Macros有错误吗?

  3. 是否有必要申报EXTRA SEGMENT?
  4. 对于任何类似的字符串输入,输出是:“它们不一样?”是什么原因?

1 个答案:

答案 0 :(得分:0)

  1. 数字6定义了您希望DOS输入的字符数加1。数字10定义了后面的缓冲区的长度。实际上7号就足够了!
  2. 宏看起来很好。
  3. 您不需要EXTRA细分。将它放入ES是错误的,因为您要比较的两个字符串都在DATA段中 此外,两个LEA指令都必须获取高2的地址。第一个字节仍然是要读取的最大字节数(6),第二个字节将是实际读取的字节数[0,5]
  4. 您所做的比较最好使用5个字符。如果你没有考虑到DOS在第二个字节中报告的实际字符数,那么难怪结果可能不会令人满意。