Несогласованный результат инструкции SCAS

Я новичок в программировании на ассемблере. Вот мои 2 кода:

1-й - из поиска в Интернете

.DATA
BLOCK DB 'You & Me'
COUNT DW 13
SEARCH DB '&'
FOUND DB 'String Found$'
NOTFOUND DB 'String NOT Found$'

.CODE
.STARTUP

MOV AX, @DATA
MOV DS, AX
MOV ES, AX
MOV CX, COUNT

MOV DI, OFFSET BLOCK
MOV AL, SEARCH
REPNE SCASB
JZ YES 

MOV DX, OFFSET NOTFOUND
MOV AH, 09
INT 21H
JMP OVER

YES:
MOV DX, OFFSET FOUND
MOV AH, 09
INT 21H    

OVER:
MOV AH, 4CH
INT 21H
 

.EXIT
END

2-й - Из моей книги

.DATA
BLOCK DB 'You & Me'

.CODE
.STARTUP

MOV DI, OFFSET BLOCK
MOV CX, 13
MOV AL, '&'
REPNE SCASB
 

.EXIT
END

Я знаю, что инструкция SCAS изменит ZF на 1, если строка найдена, и на 0, если не найдена. Я также знаю, что в конце REPNE SCASB DI будет адрес строки, когда строка будет найдена впервые. Мой вопрос: почему мой второй код не работает? Это из-за MOV AX, @DATA . . . в первом коде, который заставляет работать мой первый код, но не мой второй код?


person Rafly Yanuar    schedule 04.06.2021    source источник
comment
Да. ES необходимо установить. SCAS использует ES:DI в качестве источника. Обратитесь к справочнику по набору инструкций.   -  person Jester    schedule 05.06.2021
comment
@Шут Верно. Я предполагаю, что моя книга посвящена только определению инструкции SCAS, но не ее реализации.   -  person Rafly Yanuar    schedule 05.06.2021
comment
Ввод вручную (felixcloutier.com/x86/scas:scasb:scasw:scasd) напоминает вам, что это ES:DI. Если вы не хотите возиться с устаревшей 16-битной сегментацией памяти x86, напишите исполняемый файл .com (просто плоский двоичный файл, поэтому поместите свои данные в конец). Или используйте 32-битный или 64-битный режим. IDK, если возможно создать .exe, который автоматически включает дополнительный код (который запускается перед вашим .startup), который настраивает для вас DS и ES; возможно, ваша книга делает это? Или же ваша книга просто не проверяла свои примеры.   -  person Peter Cordes    schedule 05.06.2021
comment
Связано: Есть ли какая-либо особая причина для STOSB использовать дополнительный сегмент?. но не дубликат, поскольку реальная проблема заключается в том, что ES не настроен по умолчанию, а не в том, что scasb его использует. x86, почему я продолжаю получать CD в регистре al при перемещении переменной показывает, как использовать .com, чтобы упростить задачу (крошечный модель памяти: все в одном сегменте, с настройками сегментов при запуске.)   -  person Peter Cordes    schedule 05.06.2021
comment
@Peter Cordes: Не уверен, позволяет ли это MASM, но вы можете настроить cs:ip и ss:sp, чтобы MZ EXE запускался со всеми четырьмя регистрами сегментов одинаково, как если бы это был плоский исполняемый файл COM.   -  person ecm    schedule 05.06.2021