CMPS Сравнение строк

Флаги.

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

Команда:

CMPS destination-string,source_string 

Логика:

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

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

Операнды Такт байты (слова)ОбращенияБайтыПример
dest,source22(30)21CMPS STR1,STR2
(повтор) dest,source9+22(30)/rep 2/rep1REPE CMPS STR1,STR2

Примечания:
Эта команда всегда переводится ассемблером или в CMPSB, сравнение строк из байтов, или в CMPSW, сравнение строк из слов, в зависимости от того, являются ли операнды строками из байтов или из слов. В обоих случаях Вы должны в явном виде загрузить в регистры SI и DI смещения обеих строк. Пусть имеют место следующие определения :

         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   cmps    buffer1,buffer2		;сравниваем их.
                jne     mismatch    			;флаг ZF = 0, если сравниваемые
                                    			;строки не совпадают (mismatch)
         match:                    			;если мы попали сюда, значит, они
                                   			;совпадают (match)
                        
         mismatch:      
                dec     si         			;если мы попали сюда, то мы нашли
                dec     di         			;несовпадение, и возвращаем указатели
                                  			;SI и DI обратно, чтобы они указывали
                                  			;на первые несовпадающие элементы.

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

Hosted by uCoz