Инструменты пользователя

Инструменты сайта


examination:asm:question47

Вопрос №47. Сканирование цепочек данных

Команды, реализующие операцию-примитив сканирования цепочек, производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) элементов фиксированной длины размером 8,16 и 32 бита. Искомое значение предварительно должно быть помещено в один из регистров AL, AX, EAX. Выбор конкретного регистра из этих трех должен быть согласован с размером элементов цепочки, в которой осуществляется поиск:

SCAS адрес_приемника – сканировать цепочку (SCAning String) SCASB – сканировать цепочку байтов SCASW – сканировать цепочку слов SCASD – сканировать цепочку двойных слов

Команда SCAS

Синтаксис команды: Scas адрес_приемника

Команда имеет один операнд, обозначающий местонахождение цепочки в дополнительном сегменте (адрес цепочки должен быть заранее сформулирован в регистрах ES:EDI/DI). Транслятор анализирует тип идентификатора адрес_приемника, который обозначает цепочку в сегменте данных, и формирует одну из трех машинных команд: SCASB, SCASW, SCASD. Условие поиска для каждой из этих трех команд находится в строго определенном месте. Если цепочка описана с помощью директивы DB, то искомый элемент должен быть байтом, находиться в регистре AL, и сканирование цепочки осуществляется командой SCASB. Если цепочка описывается директивой DW, то – слово в регистре AX, поиск ведется командой SCASW. Если цепочка описана с помощью DD, то двойное слово в EAX, команда - SCASD. Принцип поиска как в команде CMPS, то есть последовательное выполнение вычитания (содержимое регистра аккумулятор минус содержимое очередного элемента цепочки). В зависимости от результатов вычитания выполняется установка флагов, при этом сами операнды не изменяются. Так же как и в случае с CMPS, с командой SCAS удобно использовать префиксы REPE, REPZ, REPNE, REPNZ.

examination/asm/question47.txt · Последние изменения: 2014/01/15 12:13 (внешнее изменение)