簡體   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