Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТ_ОРГ_1.doc
Скачиваний:
29
Добавлен:
18.11.2019
Размер:
1.27 Mб
Скачать

Сканирование строки.

Команды сканирования (seas, scasb и scasw) могут использоваться двояко. С префиксом repe команды, просматривая элементы строки, пропускают все вхождения искомого элемента в начале строки, останавливаясь на первом элементе, отличным от исходного. С префиксом repne (repeat while not equal, повторять, пока не равно) команды, наоборот, позволяют найти первое вхождение исходного элемента. Поскольку анализируемая строка считается приемником, она адресуется через регистры ES:DI. Искомый символ должен находиться в регистрах AL или АХ.

;В сегменте данных, адресуемых через ES

tail db ' /S:3'

;B сегменте команд

mov DI, offset tail

cld

mov AL, ' ' ;Искомый символ - пробел

mov CX, 80 ;Максимальная длина данной строки

repe scasb ;Сканирование байтов, пока равно

je blank ;Если в строке одни пробелы

gotit: ... ;Символ найден, DI=tail+5

blank: ...

В приведенном выше примере поиск осуществляется, пока байты строки равны исходному символу (пробелу). Команда scasb прекращает выполнение, как только она обнаруживает первый байт, отличный от пробела. При этом следует иметь в виду, что после “выхода” из команды scasb, регистр DI указывает на элемент массива, следующий за последним проанализированным, т. е. в данном случае на символ ‘S’(а не ‘/’). Если (как это скорее всего и будет) нам нужно знать положение в массиве первого элемента, отличного от искомого, содержимое DI следует уменьшить на единицу.

; в сегменте данных, адресуемом через ES

word dw 10,100,234,183,16789,0,15644,...

; в сегменте команд

mov DI, offset words ;ES:DI → words

сld ;Сканирование вперед

mov AX, 0 ;Искомое число

mov CX,1000 ;Количество слов в массиве

repe scasw ;Сканирование слов, пока не равно

jne zeros ;Если в массиве нет нулей

gotit: ... ;Первый 0 найден, DI = words+12

zeros: …

В приведенном выше примере поиск осуществляется, пока элементы массива не равны искомому числу (0). Команда scasw прекращает выполнение, как только она обнаруживает искомый элемент. При этом следует иметь в виду, что после “выхода” из команды scasw регистр DI указывает на элемент массива, следующий за последним проанализированным, т. е. в данном случае на число 15644. Если (как это, скорее всего и будет) нам нужно знать положение в массиве первого элемента, отличного от искомого, содержимое DI следует уменьшить на 2.