SCAS Просмотр строки (из байтов или слов)

Флаги.

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-str15(19)11SCAS WORD_TABLE
dest-str (повтор)9+15(19)/rep 1/rep1REPNE 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.

Hosted by uCoz