Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Операция сканирования цепочек⇐ ПредыдущаяСтр 36 из 36
Команды, реализующие эту операцию-примитив, производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) элементов фиксированной длины размером 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:
Таким образом, команда scas с префиксом repe/repz позволяет найти элемент цепочки, отличающийся по значению от заданного в аккумуляторе. Команда scas с префиксом repne/repnz позволяет найти элемент цепочки, совпадающий по значению с элементом в аккумуляторе. В качестве примера рассмотрим листинг 3, который производит поиск символа в строке. В программе используется команда-примитив scas. Символ задается явно (строка 20). Префикс повторения — repne.
Загрузка элемента цепочки в аккумулятор Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор al, ax или eax. Эту операцию удобно использовать вместе с поиском (сканированием) с тем, чтобы, найдя нужный элемент, извлечь его (например, для изменения). Возможный размер извлекаемого элемента определяется применяемой командой. Программист может использовать четыре команды загрузки элемента цепочки в аккумулятор, работающие с элементами разного размера: lods адрес_источника (LOaD String) — загрузить элемент из цепочки в регистр-аккумулятор al/ax/eax; lodsb (LOaD String Byte) — загрузить байт из цепочки в регистр al; lodsw (LOaD String Word) — загрузить слово из цепочки в регистр ax; lodsd (LOaD String Double Word) — загрузить двойное слово из цепочки в регистр eax. Рассмотрим работу этих команд на примере lods. Команда lods lods адрес_источника (LOaD String) — загрузить элемент из цепочки в аккумулятор al/ax/eax. Команда имеет один операнд, обозначающий строку в основном сегменте данных. Работа команды заключается в том, чтобы извлечь элемент из цепочки по адресу, соответствующему содержимому пары регистров ds: esi/si, и поместить его в регистр eax/ax/al. При этом содержимое esi/si подвергается инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента. Эту команду удобно использовать после команды scas, локализующей местоположение искомого элемента в цепочке. Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы. В качестве примера рассмотрим листинг 4. Программа сравнивает командой cmps две цепочки байт в памяти string1 и string2 и помещает первый несовпавший байт из string2 в регистр al. Для загрузки этого байта в регистр-аккумулятор al используется команда lods. Префикса повторения в команде lods нет, так как он попросту не нужен. Популярное:
|
Последнее изменение этой страницы: 2016-05-28; Просмотров: 586; Нарушение авторского права страницы