【问题标题】:How to compare two strings in assembly?如何比较汇编中的两个字符串?
【发布时间】:2014-11-09 19:32:26
【问题描述】:

我是组装新手。我想使用“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. 对于任何类似的字符串输入,输出是:“它们不一样?”是什么原因?

【问题讨论】:

    标签: string assembly intel x86-16


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

    【讨论】:

    • @zahra:这是关于额外段的错误答案。您可能不需要定义 EXTRA 段,但您肯定会编写 ES。 CMPS 指令隐式使用 ES,它不能被覆盖。如果您不想将 ES 设置为 EXTRA 段,则可以将其设置为 DATA 段。
    • 此外,比较失败,因为 ES 指向未初始化的 EXTRA 段。因此,ES:EDI 指向垃圾。
    • 这样吗? MOV AX,DX MOV ES,AX
    • 使用这3条指令:MOV AX,DATA MOV DS,AX MOV ES,AX
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多