Команда CMPSB


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

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

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

CMPSB

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

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

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

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

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

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

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

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

С помощью команды CMPSB в Ассемблере можно сравнивать, например, строки, как это показано в примере:

  .model	tiny
  .code
  ORG 	100h 
  
;Сбросить флаг направления
  CLD
	
;Загрузить источник (source) в DS:SI
;Загрузить цель (target) в ES:DI
  MOV  AX,  CS
  MOV  DS,  AX
  MOV  ES,  AX
  LEA  SI,  str1  
  LEA  DI,  str2
  
;Установить счётчик для размера данных в словах
  MOV  CX,  size
  
;Сравнивать, пока равно
  REPE CMPSB
  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:
str1 DB 'Test string'
str2 DB 'Test string'
size = ($ - x1) / 2

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

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

А всё вместе это будет CMPSB - CoMPare a Set of Bytes - сравнить набор байтов.



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

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

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