CMPSB Сравнение строк из байтов

Флаги.

O D I T S Z A P C
*       * * * * * 

Команда:

CMPSB

Логика

CMP (DS:SI), (ES:DI) ; только устанавливает
                                        признаки
                 if DF = 0
                     SI = SI + 1
                     DI = DI + 1
                 else
                     SI = SI - 1
                     DI = DI - 1 

Эта команда сравнивает два значения, вычитая байт, на который указывает ES:DI, из байта, на который указывает DS:SI, и устанавливает флаг в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличиваются на 1, если флаг направления сброшен, или уменьшаются на 1, если флаг направления установлен. Тем самым подготавливаются к сравнению следующие элементы обеих строк.

Операнды Такт байты (слова)ОбращенияБайтыПример
нет операндов2221CMPSB
(повтор)9+22/rep2/rep1REPE CMPSB

Пусть имеют место следующие определения :

buffer1 db  100 dup (?) 
buffer2 db 100 dup (?)

Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch) :

                cld                		;сканируя в прямом направлении
                mov    cx, 100     		;100 байтов (CX используется в REPE),
                lea    si, buffer1 		;начиная с 1го элемента BUFFER1
                lea    di, buffer2 		;и с 1го элемента BUFFER2,
         repe   cmpsb              		;сравниваем их.
                jne    mismatch    		;признак ZF = 0, если сравниваемые
                                   		;строки не совпадают (mismatch)
         match:                   		;если мы попали сюда, значит, они
                                  		;совпадают (match)
                       
         mismatch:     
                dec    si          		;если мы попали сюда, то мы нашли
                dec    di          		;несовпадение, и возвращаем указатели
                                  		;SI и DI обратно, чтобы они указывали
                                  		;на первые несовпадающие байты.

После выхода из цикла REPE CMPSB флаг ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указывать на байты, следующие непосредственно за байтами, которые не совпали; DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие байты.

Hosted by uCoz