Сравнить две цепочки на равенство - Assembler

Узнай цену своей работы

Формулировка задачи:

Пишу на чистом асме (так сказать в машинных кодах) используя отладчик. Надо сравнить две цепочки на равенство. Есть такая конструкция для этого
repne cmpsb
jne 00450421  //jmp if bufer1<>bufer2
.....               // if bufer1==bufer2
Как-бы ничего сложного, код работает. Но вот закралось сомнение. А что если окажется так, что сегмент DS окажется неравным сегменту ES? Как тогда забэкапить сегмент ES, и присвоить ему значение сегмента DS, в котором и лежат эти цепочки? Ну и соответственно вернуть обратно, потом, значение сегменту ES?

Решение задачи: «Сравнить две цепочки на равенство»

textual
Листинг программы
pushfd
push es
push ds
pop es
cld
repe cmpsb   // описАлся я в первом посте, надо было repe
jnz 00450421 //jmp if bufer1<>bufer2
............
pop es         // адрес этой команды больше 00450421 
popfd

Объяснение кода листинга программы

  1. pushfd - отправляет в стек значение регистраFD (EFLAGS).
  2. push es - отправляет в стек регистрES.
  3. push ds - отправляет в стек регистрDS.
  4. pop es - извлекает из стека значение регистраES.
  5. cld - устанавливает направление переходов в сторону увеличения (наименьшее значение в таблице переходов).
  6. repe cmpsb - выполняет сравнение двух строк посимвольно с помощью команды cmps, если условие по адресу в регистреDI не выполняется (это происходит при использовании опции repe), то команда повторяется.
  7. jnz 00450421 - если предыдущая команда (repe cmpsb) завершилась неуспешно (т.е. найден первый символ, не равный второму), то происходит переход по адресу 00450421.
  8. ...
  9. pop es - извлекает из стека значение регистраES.
  10. popfd - извлекает из стека значение регистраFD (EFLAGS).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы