ХАНДЫФАР

Инструкция CMPSB/CMPSW


Сравнить память с другой памятью


CMPSB - Сравнить байт по адресу DS:SI с байтом по адресу ES:DI.

CMPSW - Сравнить слово по адресу DS:SI со словом по адресу ES:DI.


Сравнивает содержимое ячейки памяти, адресованной регистром si, с содержимым ячейки памяти, адресованной регистром di. Сравнение выполняется путём вычитания содержимого ячейки памяти, адресуемой регистром di, из содержимого ячейки памяти, адресуемой регистром si, и использования результата для установки флагов. Ни одна из ячеек памяти, используемых при вычитании, не затрагивается. Регистры si и di увеличиваются/уменьшаются в зависимости от значения флага DF. Может быть указана 8- или 16-разрядная операция.


Флаги CF, OF, SF, ZF, AF и PF устанавливаются в соответствии с временным результатом сравнения.


В качестве примера рассмотрим случай, когда у нас есть два массива из чисел и нам необходимо каждый элемент в первом массиве сравнить с соответствующим элементов второго массива. Если все элементы в массивах не равны то, вернуть в регистре ax значение -1. Если элементы били равны, то вернуть индекс на равные эелементы в регистре ax. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____aArray__dw__6, 4, 7, 4, 5, 4, 5, 9, 8
  6. ____aArrlen equ_($-aArray) / 2
  7. ____bArray__dw__4, 3, 4, 2, 3, 3, 5, 5, 6
  8. ____bArrlen equ_aArrlen
  9. data ends
  10. code segment public
  11. ____assume ds:data, cs:code
  12. ____main proc
  13. ________mov_____ax, seg data
  14. ________mov_____ds, ax
  15. ________mov_____es, ax
  16. ________mov_____cx, aArrlen
  17. ________lea_____di, es:[bArray]
  18. ________lea_____si, ds:[aArray]
  19. ________mov_____ax, cx
  20. __repnz cmpsw
  21. ________jnz_____NotEqual
  22. ________sub_____ax, cx
  23. ________dec_____ax
  24. ________jmp_____Done
  25. ____NotEqual:
  26. ________mov_____ax, 0FFFFh
  27. ____Done:
  28. ________mov_____ax, 4C00h
  29. ________int_____21h
  30. ____main endp
  31. code ends
  32. end main

Инструкция CMPSB/CMPSW


Сравнить память с другой памятью


_____________________CMPSB - Сравнить байт по адресу DS:SI с байтом по адресу ES:DI.

_____________________CMPSW - Сравнить слово по адресу DS:SI со словом по адресу ES:DI.


Сравнивает содержимое ячейки памяти, адресованной регистром si, с содержимым ячейки памяти, адресованной регистром di. Сравнение выполняется путём вычитания содержимого ячейки памяти, адресуемой регистром di, из содержимого ячейки памяти, адресуемой регистром si, и использования результата для установки флагов. Ни одна из ячеек памяти, используемых при вычитании, не затрагивается. Регистры si и di увеличиваются/уменьшаются в зависимости от значения флага DF. Может быть указана 8- или 16-разрядная операция.


Флаги CF, OF, SF, ZF, AF и PF устанавливаются в соответствии с временным результатом сравнения.


В качестве примера рассмотрим случай, когда у нас есть два массива из чисел и нам необходимо каждый элемент в первом массиве сравнить с соответствующим элементов второго массива. Если все элементы в массивах не равны то, вернуть в регистре ax значение -1. Если элементы били равны, то вернуть индекс на равные эелементы в регистре ax. Количество загружаемых данных указывается в регистре cx.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____aArray__dw__6, 4, 7, 4, 5, 4, 5, 9, 8
  6. ____aArrlen equ_($-aArray) / 2_; Длина массива aArray
  7. ____bArray__dw__4, 3, 4, 2, 3, 3, 5, 5, 6
  8. ____bArrlen equ_aArrlen________; Длина массива bArray равна длине массива aArray
  9. data ends
  10. code segment public _____________; Начало сегмента кода
  11. ____assume ds:data, cs:code
  12. ____main proc ___________________; Начало процедуры main
  13. ________mov_____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  14. ________mov_____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  15. ________mov_____es, ax___________; Передаём адрес сегмента памяти данных из регистра ax в es
  16. ________mov_____cx, aArrlen______; Устанавливаем счётчик равным длине массива aArray
  17. ________lea_____di, es:[bArray]__; Загружаем адрес переменной bArray в регистр es:di
  18. ________lea_____si, ds:[aArray]__; Загружаем адрес переменной aArray в регистр es:di
  19. ________mov_____ax, cx___________; Сохраняем длину массива aArray в регистре ax
  20. __repnz cmpsw____________________; Сравниваем элемент в ds:si с es:di пока CX≠0 или флаг ZF≠0
  21. ________jnz_____NotEqual_________; Если ZF=0 то, прыгаем на метку NotEqual
  22. ________sub_____ax, cx___________; Отнимает от длины массива состояние регистра cx
  23. ________dec_____ax_______________; Уменьшаем ax на 1 что бы он указывал на найденный элемент
  24. ________jmp_____Done_____________; Выполняем безусловный переход на метку Done
  25. ____NotEqual:
  26. ________mov_____ax, 0FFFFh_______; Копируем значение -1 в регистр ax
  27. ____Done:
  28. ________mov_____ax, 4C00h________; Копируем значение функции завершения процесса в ah а значение в al
  29. ________int_____21h _____________; Вызываем прерывание DOS
  30. ____main endp ___________________; Конец процедуры main
  31. code ends _______________________; Конец сегмента кода
  32. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda