Флаги.
O D I T S Z A P C * * * * * *
Команда:
SCAS destination-string
Логика:
CMP Accumulator,(ES:DI) ; только устанавливает признаки if DF = 0 DI = DI + n ; n = 1 для байта, 2 для слова else DI = DI - n
Эта команда сравнивает аккумулятор (AL или AX) с байтом или словом, на которое указывает ES:DI, и устанавливает признаки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, DI увеличивается на 1 (для байтов) или 2 (для слов), если флаг направления сброшен, или уменьшается на 1 или 2, если флаг направления установлен. Тем самым подготавливается к сравнению следующий элемент строки.
Операнды | Такт байты (слова) | Обращения | Байты | Пример |
dest-str | 15(19) | 1 | 1 | SCAS WORD_TABLE |
dest-str (повтор) | 9+15(19) | /rep 1/rep | 1 | REPNE SCAS BYTE_TABLE |
Примечания:
Эта команда всегда ассемблируется или как SCASB, просмотр строки из байтов, или как SCASW, просмотр строки из слов, в зависимости от того, является ли операнд строкой из байтов или из слов. В обоих случаях Вы должны в явном виде загрузить в регистр DI смещение строки.
Команда SCAS полезна в тех случаях, когда требуется найти ячейку с заданным байтом или словом. Если Вы хотите сравнить две строки из памяти поэлементно, то используйте команду CMPS.
Пример.
Пусть имеет место следующее определение :
LOST_A DB 100 dup (?)
Тогда следующий пример описывает поиск символа 'A' в блоке памяти длиной 100 байтов, начинающемся с LOST_A :
MOV AX,DS MOV ES,AX ;SCAS использует ES:DI, ;поэтому копируем DS в ES CLD ;сканировать будем в прямом направлении MOV AL,'A' ;ищем "потерянное" 'A' MOV CX,100 ;сканировать будем 100 байтов ;(CX используется в REPNE) LEA DI,LOST_A ;засылаем стартовый адрес в DI REPNE SCAS LOST_A ;ищем 'A' JE FOUND ;признак ZF равен 1, если мы нашли 'A' NOTFOUND: ;если мы попали сюда, то 'A' не обнаружено FOUND:DEC DI ;возвращаем указатель DI на первое ;обнаруженное вхождение 'A'
После выхода из цикла REPNE SCAS, ZF=1, если вхождение 'A' было обнаружено, и ZF=0, иначе. В первом случае DI указывает на байт, следующий за байтом, где находится 'A', поэтому мы производим коррекцию указателя DI с помощью DEC DI.