Операция сканирования цепочек
Команды, реализующие эту операцию-примитив, производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) элементов фиксированной длины размером 8, 16 или 32 бит.
Искомое значение предварительно должно быть помещено в регистр al/ax/eax. Выбор конкретного регистра из этих трех должен быть согласован с размером элементов цепочки, в которой осуществляется поиск.
Система команд микропроцессора предоставляет программисту четыре команды сканирования цепочки.
Выбор конкретной команды определяется размером элемента:
- scas адрес_приемника (SCAning String) — сканировать цепочку;
- scasb (SCAning String Byte) — сканировать цепочку байт;
- scasw (SCAning String Word) — сканировать цепочку слов;
- scasd (SCAning String Double Word) — сканировать цепочку двойных слов.
Команда scas
scas адрес_приемника
Команда имеет один операнд, обозначающий местонахождение цепочки в дополнительном сегменте (адрес цепочки должен быть заранее сформирован в es:edi/di).
Транслятор анализирует тип идентификатора адрес_приемника, который обозначает цепочку в сегменте данных, и формирует одну из трех машинных команд scasb, scasw или scasd.
Условие поиска для каждой из этих трех команд находится в строго определенном месте. Так, если цепочка описана с помощью директивы db, то искомый элемент должен быть байтом и находиться в al, а сканирование цепочки осуществляется командой scasb; если цепочка описана с помощью директивы dw, то это — слово в ax, и поиск ведется командой scasw; если цепочка описана с помощью директивы dd, то это — двойное слово в eax, и поиск ведется командой scasd. Принцип поиска тот же, что и в команде сравнения cmps, то есть последовательное выполнение вычитания
(содержимое_регистра_аккумулятора - содержимое_очередного_элемента_цепочки).
В зависимости от результатов вычитания производится установка флагов, при этом сами операнды не изменяются.
Так же, как и в случае команды cmps, с командой scas удобно использовать префиксы repe/repz или repne/repnz:
· repe или repz — если нужно организовать поиск до тех пор, пока не будет выполнено одно из двух условий:
· достигнут конец цепочки (содержимое ecx/cx равно 0);
· в цепочке встретился элемент, отличный от элемента в регистре al/ax/eax;
· repne или repnz — если нужно организовать поиск до тех пор, пока не будет выполнено одно из двух условий:
· достигнут конец цепочки (содержимое ecx/cx равно 0);
· в цепочке встретился элемент, совпадающий с элементом в регистре al/ax/eax.
Таким образом, команда scas с префиксом repe/repz позволяет найти элемент цепочки, отличающийся по значению от заданного в аккумуляторе.
Команда scas с префиксом repne/repnz позволяет найти элемент цепочки, совпадающий по значению с элементом в аккумуляторе.