Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何比较汇编中的两个字符串?_String_Assembly_Intel_X86 16 - Fatal编程技术网

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

String 如何比较汇编中的两个字符串?,string,assembly,intel,x86-16,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,0

我是装配新手。我想用“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
我有一些问题:

  • 下面代码中的数字6,10是什么:

    USER DB 6,10 DUP('$')
    
  • 宏有什么错误吗

  • 是否需要声明额外的段
  • 对于任何类似的字符串输入,输出是:“它们不一样?”原因是什么
  • 数字6定义要DOS输入的字符数加1。数字10定义了后面缓冲区的长度。事实上,7这个数字就足够了
  • 宏看起来很好
  • 你不需要额外的部分。此外,将其放入ES是错误的,因为要比较的两个字符串都在数据段中。
    此外,两条LEA指令都必须获取一个高2的地址。第一个字节仍然是要读取的最大字节数(6),第二个字节将是实际读取的字节数[0,5]
  • 您正在进行的比较使用了5个字符。如果不考虑DOS在第二个字节中报告的实际字符数,难怪结果可能不令人满意
    @萨拉:这是一个关于额外部分的错误答案。您可能不需要定义额外的段,但您肯定要编写ES。CMPS指令隐式使用ES,不能重写。如果不想将ES设置为额外段,则可以将其设置为数据段。此外,比较失败,因为ES指向未初始化的额外段。因此,ES:EDI指向垃圾。像这样?MOV AX、DX MOV ES、AX使用以下3条指令:MOV AX、数据MOV DS、AX MOV ES、AX