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 | 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 и команды , , , ,
,