Я новичок в программировании на ассемблере. Вот мои 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 . . .
в первом коде, который заставляет работать мой первый код, но не мой второй код?
ES
необходимо установить.SCAS
используетES:DI
в качестве источника. Обратитесь к справочнику по набору инструкций. - person Jester   schedule 05.06.2021SCAS
, но не ее реализации. - person Rafly Yanuar   schedule 05.06.2021ES:DI
. Если вы не хотите возиться с устаревшей 16-битной сегментацией памяти x86, напишите исполняемый файл.com
(просто плоский двоичный файл, поэтому поместите свои данные в конец). Или используйте 32-битный или 64-битный режим. IDK, если возможно создать .exe, который автоматически включает дополнительный код (который запускается перед вашим .startup), который настраивает для вас DS и ES; возможно, ваша книга делает это? Или же ваша книга просто не проверяла свои примеры. - person Peter Cordes   schedule 05.06.2021cs:ip
иss:sp
, чтобы MZ EXE запускался со всеми четырьмя регистрами сегментов одинаково, как если бы это был плоский исполняемый файл COM. - person ecm   schedule 05.06.2021