ПРИМЕР применения команды repne scas
JCXZ меткаЦепочкуПросканировалиПолностью
REPX SCAS адрес_приемника
Анализ причины выхода из цикла
ПРЕФИКСЫ ПОВТОРЕНИЯ ДЛЯ SCAS
Если эта метка была определена директивой DD, то содержимое аккумулятора EAX сравнивается с двойным словом цепочки.
Если эта метка была определена директивой DW, то содержимое аккумулятора AX сравнивается со словом цепочки.
РАЗМЕР ЭЛЕМЕНТОВ определяется по атрибуту приемника.
SCAs адрес_приемника
У этой команды машинного кода нет. Она существует только для удобства программиста.
ФОРМАТЫ КОМАНД СКАНИРОВАНИЯ
SCAS адрес_приемника
(SCAn Strings) — сканировать цепочку;
РЕАЛЬНО ТРАНСЛЯТОР СОЗДАЕТ ТАКИЕ КОМАНДЫ:
SCASB
(SCAn String of Bytes) — сканировать цепочку байт;
SCASW
(SCAn String of Words) — сканировать цепочку слов;
SCASD
(SCAn String of Double words) — сканировать цепочку двойных слов.
Вычитает из «ключа» (байта, слова или двойного слова, которые находятся в аккумуляторе), элемент цепочки, адресуемой операндом адрес_приемника.
ФЛАГИ УСТАНАВЛИВАЮТСЯ, РЕЗУЛЬТАТ НЕ СОХРАНЯЕТСЯ.
Если эта метка была определена директивой DB,
то содержимое аккумулятора AL сравнивается с байтом цепочки.
При транслятор преобразует ее в одну из трех машинных команд: CMPSB, CMPSW или CMPSD.
REPE или REPZ — если необходимо организовать ПРОПУСК одинаковых «ключей» в цепочке. Сканирование делается до тех пор, пока не будет выполнено одно из двух условий:
• Или достигнут конец цепочки (содержимое CX равно нулю);
• Или в цепочке встретился элемент, НЕ СОВПАДАЮЩИЙ с «ключом» из аккумулятора (флаг ZF стал равен нулю).
REPNE или REPNZ — если нужно организовать ПОИСК в цепочке элемента, равного «ключу». Сканирование проводится до тех пор, пока не будет выполнено одно из двух условий :
• Или достигнут конец цепочки (содержимое CX равно нулю);
• Или в цепочке встретился элемент, СОВПАДАЮЩИЙ с «ключом» из аккумулятора (флаг ZF стал равен единице).
; тут ситуация, когда цикл сканирования
; прервался РАНЬШЕ, чем окончилась цепочка,
; то есть на основании анализа флага ZF.
; При этом в СХ останется НЕНУЛЕВОЕ значение.
меткаЦепочкуПросканировалиПолностью:
; а тут ситуация, когда причиной выхода
; стало CX = 0, то есть просмотрели ВСЮ цепочку.
<1> Поиск в строке первой русской ‘а’ . Автор: В. ЮРОВ
<2> MASM
<3> MODEL small
<4> STACK 256
<5> .DATA
<6> ;тексты сообщений
<7> fnd db 0ah,0dh,'Символ найден! ','$'
<8> nochar db 0ah,0dh,'Символ не найден.','$'
<9> ;строка для поиска
<10> string db 'Поиск символа в этой строке.',0ah,0dh,'$'
<11> .CODE
<12> ASSUME ds:@data,es:@data
<13> main:
<14> mov ax,@data
<15> mov ds,ax
<16> mov es,ax ;настройка ES на DS
<17> mov ah,09h
<18> lea dx,string
<19> int 21h ;вывод сообщения string
<20> mov al,'а' ;символ для поиска — `а`(кириллица)
<21> cld ;сброс флага df
<22> lea di,string ;загрузка в es:di смещения строки
<23> mov cx,29 ;для префикса repne — длина строки
<24> ;поиск в строке (пока искомый символ
; и символ в строке не совпадут)
<25> ;выход при первом совпадении
<26> REPNE SCAS string
<27> je found ;если равны — переход на обработку,
<28> failed: ;иначе выполняем некоторые действия
<29> ;вывод сообщения о том, что символ не найден
<30> mov ah,09h
<31> lea dx,nochar
<32> int 21h ;вывод сообщения nochar
<33> jmp exit ;на выход
<34> found: ;совпали
<35> mov ah,09h
<36> lea dx,fnd
<37> int 21h ;вывод сообщения fnd
<38> ;теперь, чтобы узнать место, где совпал элемент в строке,
<39> ;необходимо уменьшить значение в регистре di
; и вставить нужный обработчик
<40> dec di
<41> ; . . . <вставьте код-обработчик здесь > . . .
<42> exit: ;выход
<43> mov ax,4c00h
<44> int 21h
<45> end main
ЗАГРУЗКА ЭЛЕМЕНТА ЦЕПОЧКИ В АККУМУЛЯТОР