Флаги.
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,source | 22(30) | 2 | 1 | CMPS STR1,STR2 |
(повтор) dest,source | 9+22(30) | /rep 2/rep | 1 | REPE 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 уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие байты.