Справочник по языку Ассемблера IBM PC

     

SCAS/SCASB/SCASW/SCASD


Сканирование строки байтов/слов/двойных слов

ASCII-коррекция после сложения

Схема команды:  scas приемник 
scasb 
scasw 
scasd

Назначение: поиск значения в последовательности (цепочке) элементов в памяти.


Алгоритм работы:

выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;

по результату вычитания установить флаги;

изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:



df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;

df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r

Применение:


Команды сканирования сравнивают значение в регистре eax/ax/al с ячейкой памяти, локализуемой парой регистров es:edi/di. Размер сравниваемого элемента зависит от применяемой команды. Команда scas может работать с элементами размером в байт, слово или двойное слово. В качестве операнда в команде указывается идентификатор последовательности элементов в памяти. Реально этот идентификатор используется лишь для получения типа элементов последовательности, а ее адрес должен быть предварительно загружен в указанную выше пару регистров. Транслятор, обработав команду scas и выяснив тип операндов, генерирует одну из машинных команд:: scasb, scasw или scasd. Машинного аналога для команды scas нет. Для адресации операнда источник обязательно должен использоваться регистр es.
Для того чтобы эту команду можно было использовать для поиска значения в последовательности элементов, имеющих размерность байт, слово или двойное слово, необходимо использовать один из префиксов repe или repne. Эти префиксы не только заставляют циклически выполняться команду поиска, пока ecx/cx<>0, но и отслеживают состояние флага zf (см. команды rep/repe/repne).

;сосчитать число пробелов в строке str .data str     db      '...' len_str=$-str .code         mov     ax,@data         mov     ds,ax         mov     es,ax         lea     di,str         mov     cx,len_str      ;длину строки — в cx         mov     al,' '         mov     bx,0    ;счетчик для подсчета пробелов в строке         cld cycl: repe    scasb         jcxz    exit    ;переход на exit, если цепочка просмотрена полностью         inc     bx         jmp     cycl exit:   ...         

См. также: урок 11 и команды , , , ,
,



Содержание раздела