ПРИМЕР применения команды 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

 

ЗАГРУЗКА ЭЛЕМЕНТА ЦЕПОЧКИ В АККУМУЛЯТОР