Команда CMPSW


Лучшие книги по Ассемблеру Лучшие книги по Ассемблеру

Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее...

Команда CMPSW в Ассемблере выполняет сравнение последовательности слов из участка памяти, адрес которого указан в регистре ESI, с другим участком, адрес которого указан в регистре DSI. Синтаксис:

CMPSW

Команда не имеет операндов. В зависимости от результата могут изменяться флаги OF, SF, ZF, AF, PF, CF.

ПРИМЕЧАНИЕ: Для процессора 8086 используются пары регистров ES:DI и DS:SI, как это показано в примере ниже.

Алгоритм выполнения команды CMPSW:

  • DS:[SI] - ES:[DI]
  • Установить флаги OF, SF, ZF, AF, PF, CF в соответствии с результатом
  • Если DF = 0 то:
    • SI = SI + 2
    • DI = DI + 2
  • Иначе:
    • SI = SI - 2
    • DI = DI - 2

Подробнее про флаг DF можете почитать здесь.

То есть с помощью команды REPE команда CMPSW выполняется до тех пор, пока флаг ZF равен 1. Однако команда вызывается не более, чем указано в СХ (а в этом регистре указана длина массива данных - количество слов для сравнения).

То есть выполняется последовательное сравнение двух массивов данных по каждому слову. И если какая-то пара слов в последовательности отличается, то флаг ZF будет сброшен в 0 и вызов команды CMPSW прекратится, даже если ещё не весь массив данных проверен. Таким образом выполняется проверка слов на равенство до первого несовпадения.

Это также позволяет определить номер слова в массиве, где обнаружено несовпадение (этот номер будет в счётчике СХ после завершения сравнения, отсчёт начинается с нуля).

Пример:

  .model	tiny
  .code
  ORG 	100h 
  
;Сбросить флаг направления
  CLD
	
;Загрузить источник (source) в DS:SI
;Загрузить цель (target) в ES:DI
  MOV  AX,  CS
  MOV  DS,  AX
  MOV  ES,  AX
  LEA  SI,  data1  
  LEA  DI,  data2
  
;Установить счётчик для размера данных в словах
  MOV  CX,  size
  
;Сравнивать, пока равно
  REPE CMPSW
  JNZ  NotEqual

;"yes" - равно
  MOV  AL,  'y'
  MOV  AH,  0Eh
  INT  10h
  
  JMP  ExitHere

NotEqual:

;"no" - не равно
  MOV  AL, 'n'
  MOV  AH, 0Eh
  INT  10h
  
ExitHere:

;Ждать нажатия клавиши:
  MOV  AH,  0
  INT  16h
  
  RET
  
;Массивы данных должны иметь одинаковый размер:
x1:
data1 DW 1234h, 5678h, 9012h, 3456h
data2 DW 1234h, 5678h, 9012h, 3456h
size = ($ - x1) / 4

Напоследок, как всегда, о происхождении аббревиатуры CMPSW.

CMP - это сокращение от английского слова COMPARE, которое можно перевести как “сравнить”. Ну а SW - это Set Words - набор слов.

А всё вместе это будет CMPSW - CoMPare a Set of Words - сравнить набор слов.

См. также описание команды CMPSB.



Первые шаги в программирование Первые шаги в программирование

Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su