Сканирование строки байтов/слов/двойных слов
ASCII-коррекция после сложения
Схема команды:
| scas приемник
scasb
scasw
scasd
|
Назначение: поиск значения в последовательности (цепочке) элементов в памяти.
Синтаксис
Алгоритм работы:
- выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;
- по результату вычитания установить флаги;
- изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
- df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
- df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.
Состояние флагов после выполнения команды:
|
|
|
|
|
|
OF
| SF
| ZF
| AF
| PF
| CF
|
r
| r
| r
| r
| r
| r
|
Применение:
Команды сканирования сравнивают значение в регистре eax/ax/al с ячейкой памяти, локализуемой парой регистров es:edi/di. Размер сравниваемого элемента зависит от применяемой команды. Команда scas может работать с элементами размером в байт, слово или двойное слово. В качестве операнда в команде указывается идентификатор последовательности элементов в памяти. Реально этот идентификатор используется лишь для получения типа элементов последовательности, а ее адрес должен быть предварительно загружен в указанную выше пару регистров. Транслятор, обработав команду scas и выяснив тип операндов, генерирует одну из машинных команд:: scasb, scasw или scasd. Машинного аналога для команды scas нет. Для адресации операнда источник обязательно должен использоваться регистр es.
Для того чтобы эту команду можно было использовать для поиска значения в последовательности элементов, имеющих размерность байт, слово или двойное слово, необходимо использовать один из префиксов repe или repne. Эти префиксы не только заставляют циклически выполняться команду поиска, пока ecx/cx<>0, но и отслеживают состояние флага zf (см. команды rep/repe/repne).
;сосчитать число пробелов в строке str.datastr db '...'len_str=$-str.code mov ax,@data mov ds,ax mov es,ax lea di,str mov cx,len_str ;длину строки — в cx mov al,' ' mov bx,0 ;счетчик для подсчета пробелов в строке cldcycl:repe scasb jcxz exit ;переход на exit, если цепочка просмотрена полностью inc bx jmp cyclexit: ... |
См. также: урок 11 и команды cmps/cmpsb/cmpsw/cmpsd, ins/insb/insw/insd, lods/lodsb/lodsw/lodsd, movs/movsb/movsw/movsd, outs, stos/stosb
/stosw/stosd, rep/repe/repz/repne/repnz