繁体   English   中英

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

[英]How to compare two strings in assembly?

我是新来的。 我想使用“ 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. 宏有什么错误吗?

  3. 是否需要申报EXTRA SEGMENT?
  4. 对于任何类似的字符串输入,输出为:“它们不相同吗?” 是什么原因?
  1. 数字6定义要DOS输入的字符数加1。 数字10定义了后面的缓冲区的长度。 实际上,数字7就足够了!
  2. 宏看起来不错。
  3. 您不需要EXTRA细分。 此外,将其放入ES是错误的,因为您要比较的两个字符串都在DATA段中。
    同样,两个LEA指令都必须获取高2的地址。 第一个字节仍然是要读取的最大字节数(6),第二个字节将是实际读取的字节数[0,5]
  4. 您进行的比较毫无疑问地使用了5个字符。 如果您不考虑DOS在第二个字节中报告的实际字符数,也就不足为奇了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM