Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Сканирование цепочек
Команды производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) элементов фиксированной длины размером 8, 16 или 32 бита. Искомое значение значение предварительно должно быть помещено в регистр al/ax/eax. Выбор конкретного регистра из этих трех должен быть согласован с размером элементов цепочки, в которой осуществляется поиск. Команда sсas sсas адрес_приемника Команда имеет один операнд, обозначающий местонахождение цепочки в дополнительном сегменте (адрес цепочки должен быть заранее сформирован в es: edi/di). Транслятор анализирует тип идентификатора адрес_приемника, который обозначает цепочку в сегменте данных, и формирует одну из трех машинных команд, scasb, scasw или scasd. Условие поиска для каждой из этих трех команд находится в строго определенном месте. Так, если цепочка описана с помощью директивы db, то искомый элемент должен быть байтом и находиться в al, а сканирование цепочки осуществляется командой scasb; если цепочка описана с помощью директивы dw, то это — слово в ах, и поиск ведется командой scasw; если цепочка описана с помощью директивы dd, то это двойное слово в еах, и поиск ведется командой scasd. Принцип поиска тот же, что и в команде сравнения cmps, то есть последовательное выполнение вычитания (содержимое_регистра_аккумулятора – содержимое_очередного_элемента_цепочки). В зависимости от результатов вычитания производится установка флагов, при этом сами операнды не изменяются Так же как и в случае команды cmps, с командой seas удобно использовать префиксы repe/repz или repne/repnz: - rере или repz — если нужно организовать поиск до тех пор, пока не будет выполнено одно из двух условий: достигнут конец цепочки (содержимое есх/сх равно 0); в цепочке встретился элемент, отличный от элемента в регистре al/ax/eax. - rерnе или repnz — если нужно организовать поиск до тех пор, пока не будет выполнено одно из двух условий: достигнут конец цепочки (содержимое есх/сх равно 0); в цепочке встретился элемент, совпадающий с элементом в регистре al/ax/eax. Таким образом, команда scas с префиксом repe/repz позволяет найти элемент цепочки, отличающийся по значению от заданного в аккумуляторе. Команда scas с префиксом repne/repnz позволяет найти элемент цепочки, совпадающий по значению с элементом в аккумуляторе. Пример. Поиск символа в строке.
; prg_11_3.asm MASM MODEL small STACK 256 .data ; тексты сообщений fnd db 0ah, 0dh, 'Символ найден! ', '$' nochar db 0ah, 0dh, 'Символ не найден.', '$' ; строка для поиска string db 'Поиск символа в этой строке.', 0ah, 0dh, '$' .code ASSUME ds: @data, es: @data main: mov ax, @data mov ds, ax mov es, ax; настройка ES на DS mov ah, 09h lea dx, string int 21h; вывод сообщения string mov al, 'а'; символ для поиска - `а`(кириллица) cld; сброс флага df lea di, string; загрузка в es: di смещения строки mov cx, 29; для префикса repne - длина строки ; поиск в строке (пока искомый символ и символ в строке не совпадут) ; выход при первом совпадении repne scas string je found; если равны - переход на обработку, failed:; иначе выполняем некоторые действия ; вывод сообщения о том, что символ не найден mov ah, 09h lea dx, nochar int 21h; вывод сообщения nochar jmp exit; на выход found:; совпали mov ah, 09h lea dx, fnd int 21h; вывод сообщения fnd ; теперь, чтобы узнать место, где совпал элемент в строке, ; необходимо уменьшить значение в регистре di и вставить нужный обработчик ; dec di ;... вставьте обработчик exit:; выход mov ax, 4c00h int 21h end main
|