Иллюстрированный самоучитель по Assembler

S

SCAS Сканирование строки с целью сравнения. SCASB Сканирование строки байтов с целью сравнения. SCASW Сканирование строки слов с целью сравнения.

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравнивают содержимое регистра AL (в случае операций над байтами) или АХ (в случае операций над словами) с содержимым ячейки памяти по адресу, находящемуся в паре регистров ES:DI. Операция сравнения осуществляется путем вычитания содержимого ячейки памяти из содержимого AL или АХ. Результат операции воздействует на регистр флагов, но не изменяет ни один из операндов. Таким образом, операцию сравнения можно условно изобразить следующим образом:

АХ или AL – (ES:DI) ® флаги процессора

После каждой операции сравнения регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2, в зависимости от размера сравниваемых элементов.

Вариант команды SCAS имеет формат:

sсas строка

(Что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка). Замена сегмента строки невозможна.

Рассматриваемые команды могут предваряться префиксами повторения repe/repz (повторять, пока элементы равны, т.е. до первого неравенства) и repne/repiiz (повторять, пока элементы не равны, т.е. до первого равенства). В любом случае выполняется не более СХ операций над последовательными элементами.

После выполнения рассматриваемых команд регистр DI указывает на ячейку памяти, находящуюся за тем (если DF=0) или перед тем (если DF=1) элементом строки, на котором закончились операции сравнения. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Пример 1:

;В полях данных сегмента данных, адресуемого через ES:
string db ' /Т:4'
;В программном сегменте:
сld; Поиск вперед по строке
lea DI,string; ES:DI ® string
mov AL, ' '; Символ, который мы пропускаем
mov CX,8; Длина строки repe scasb
;Поиск первого символа,
;отличного от пробела
je blank; Символ не найден – одни пробелы
gotit:; Продолжение, если символ найден

В примере 1 в строке имеются символы, отличные от искомого (кода пробела), и команда je выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ES:D1 указывают на символ строки, следующий за отличным от пробела (в данном случае символ "Т").

Пример 2:

; В полях данных сегмента данных, адресуемого через ES:
string db ' /Т:4'
; В программном сегменте:
cld;Поиск вперед по строке
lea DI,string; ES:DI ® string
mov AL, '/'; Искомый символ
mov CX,8; Длина строки
repne scasb; Поиск символа / в строке
jne blank; Искомого символа нет
g'otit:; Искомый символ найден

В примере 2 в строке имеется искомый символ ("/"), и команда jne выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ES:DI указывают на символ строки, следующий за найденным знаком "/" (в данном случае символ "Т").

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.