2014-11-09 3 views
1

Я новичок в сборе. Я хочу сравнить две строки, используя «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. Is есть ли ошибка с Макросами?

  3. Нужно ли объявлять ДОПОЛНИТЕЛЬНЫЙ СЕГМЕНТ?
  4. Для любых аналогичных строк входной сигнал: «они не то же самое?» какова причина?

ответ

0
  1. Число 6 определяет количество символов плюс 1, которые вы хотите DOS для ввода. Число 10 определяет длину следующего буфера. На самом деле номер 7 был бы достаточно!
  2. Макросы кажутся прекрасными.
  3. Вам не нужен сегмент EXTRA. Более того, включение его в ES неверно, потому что обе строки, которые вы будете сравнивать, находятся в сегменте DATA.
    Также обе инструкции LEA должны получить адрес, который на 2 выше. Первый байт по-прежнему будет максимальным числом байтов для чтения (6), а второй байт будет числом фактически прочитанных байтов [0,5]
  4. Сравнение, которое вы произвольно используете, составляет 5 символов. Если вы не принимаете во внимание действительное количество символов, о которых сообщает DOS во втором байте, неудивительно, что результаты могут быть неудовлетворительными.
+0

@zahra: Это неправильный ответ в отношении ЭКСТРАЛЬНОГО СЕГМЕНТА. Возможно, вам не нужно определять сегмент EXTRA, но вы наверняка напишите ES. Инструкция CMPS неявно использует ES, и ее нельзя переопределить. Если вы не хотите устанавливать ES в сегмент EXTRA, вы можете установить его в сегмент DATA. –

+0

Кроме того, сравнение не выполняется, потому что ES указывает на сегмент EXTRA, который не инициализирован. Таким образом, ES: EDI указывает на мусор. –

+0

@NathanFellman Как мне установить ES в сегмент DATA? – zahra

Смежные вопросы