Сравнить две цепочки на равенство - Assembler
Формулировка задачи:
Пишу на чистом асме (так сказать в машинных кодах) используя отладчик.
Надо сравнить две цепочки на равенство.
Есть такая конструкция для этого
Как-бы ничего сложного, код работает. Но вот закралось сомнение.
А что если окажется так, что сегмент DS окажется неравным сегменту ES?
Как тогда забэкапить сегмент ES, и присвоить ему значение сегмента DS, в котором и лежат эти цепочки?
Ну и соответственно вернуть обратно, потом, значение сегменту ES?
repne cmpsb jne 00450421 //jmp if bufer1<>bufer2 ..... // if bufer1==bufer2
Решение задачи: «Сравнить две цепочки на равенство»
textual
Листинг программы
pushfd push es push ds pop es cld repe cmpsb // описАлся я в первом посте, надо было repe jnz 00450421 //jmp if bufer1<>bufer2 ............ pop es // адрес этой команды больше 00450421 popfd
Объяснение кода листинга программы
- pushfd - отправляет в стек значение регистраFD (EFLAGS).
- push es - отправляет в стек регистрES.
- push ds - отправляет в стек регистрDS.
- pop es - извлекает из стека значение регистраES.
- cld - устанавливает направление переходов в сторону увеличения (наименьшее значение в таблице переходов).
- repe cmpsb - выполняет сравнение двух строк посимвольно с помощью команды cmps, если условие по адресу в регистреDI не выполняется (это происходит при использовании опции repe), то команда повторяется.
- jnz 00450421 - если предыдущая команда (repe cmpsb) завершилась неуспешно (т.е. найден первый символ, не равный второму), то происходит переход по адресу 00450421.
- ...
- pop es - извлекает из стека значение регистраES.
- popfd - извлекает из стека значение регистраFD (EFLAGS).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д