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
У меня есть вопрос:
, что это именно число 6,10 в коде ниже:
USER DB 6,10 DUP('$')
Is есть ли ошибка с Макросами?
- Нужно ли объявлять ДОПОЛНИТЕЛЬНЫЙ СЕГМЕНТ?
- Для любых аналогичных строк входной сигнал: «они не то же самое?» какова причина?
@zahra: Это неправильный ответ в отношении ЭКСТРАЛЬНОГО СЕГМЕНТА. Возможно, вам не нужно определять сегмент EXTRA, но вы наверняка напишите ES. Инструкция CMPS неявно использует ES, и ее нельзя переопределить. Если вы не хотите устанавливать ES в сегмент EXTRA, вы можете установить его в сегмент DATA. –
Кроме того, сравнение не выполняется, потому что ES указывает на сегмент EXTRA, который не инициализирован. Таким образом, ES: EDI указывает на мусор. –
@NathanFellman Как мне установить ES в сегмент DATA? – zahra