Scas/scasb/scasw/scasd
Сканирование строки байтов/слов/двойных слов
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
SETcc
(byte SET on condition)
Установка байта по условию
Схема команды: | setcc операнд |
Назначение: установка операнда логическим значением в зависимости от истинности условия, заданного модификатором кода операции cc.
Синтаксис
Алгоритм работы:
Команда проверяет истинность условия, заданного в коде операции, то есть, фактически, состояние определенных флагов.
Команды установки байтов
Команда | Проверяемые флаги | Логическое условие |
SETA/SETNBE | CF = 0 и ZF = 0 | (выше)/(не ниже или равно) |
SETAE/SETNB | CF = 0 | (выше или равно)/(не ниже) |
SETB/SETNAE | CF = 1 | (ниже)/(не выше или равно) |
SETBE/SETNA | CF = 1 или ZF = 1 | (ниже или равно)/(не выше) |
SETC | CF = 1 | перенос |
SETE/SETZ | ZF = 1 | ноль |
SETG/SETNLE | ZF = 0 или SF = OF | (больше)/(не меньше или равно) |
SETGE/SETNL | SF = OF | (больше или равно)/(не меньше) |
SETL/SETNGE | SF <> OF | если SF <> OF |
SETLE/SETNG | ZF=1 или SF <> OF | (меньше или равно)/(не больше) |
SETNC | CF = 0 | нет переноса |
SETNE/SETNZ | ZF = 0 | не равно нулю |
SETNO | OF=0 | нет переполнения |
SETNP/SETPO | PF = 0 | (неравенство)/(нет контроля четности) |
SETNS | SF = 0 | нет знака, число положительное |
SETO | OF = 1 | переполнение |
SETP/SETPE | PF = 1 | контроль четности/равенство |
SETS | SF = 1 | если знак минус, число отрицательное |
Если проверяемое условие (или содержимое соответствующих флагов на момент выдачи команды setcc) истинно, то установить значение операнда в 01h, если условие ложно — то в 00h.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Эти команды можно использовать после любой команды, изменяющей флаги, при необходимости анализа результата изменений. Если проанализировать условия для команд условного перехода, то обнаружится их полное соответствие с условиями, обрабатываемыми командой setcc, за исключением, конечно, команд jcxz и jecxz.
;подсчитать число единичных битов в регистре ax mov cx,16m1: rol ax,1 setc bl add bh,bl clc loop m1 |
См. также: урок 10 и команду jcc
SGDT
(Store Global Descriptor Table)
Сохранение регистра глобальной дескрипторной таблицы
Схема команды: | sgdt источник |
Назначение: извлечение содержимого системного регистра gdtr, содержащего значения базового адреса и размера глобальной дескрипторной таблицы GDT.
Синтаксис
Алгоритм работы:
Команда выполняет чтение содержимого системного регистра gdtr в область памяти размером 48 бит. Структурно эти 48 бит представляют 16 бит размера и 32 бита значения базового адреса начала таблицы GDT в памяти.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду sgdt применяют при работе системных программ с уровнем привилегий 0, в частности, при написании различных драйверов.
.286;структура для описания псевдодескриптора gdtrpoint STRUClim dw 0adr dd 0 ENDS.datapoint_gdt point .code...;читаем содержимое gdtr sgdt point_gdt... |
См. также: уроки 16, 17 и команду lgdt
SIDT
(Store Interrupt Descriptor Table)
Сохранение регистра глобальной дескрипторной таблицы прерываний
Схема команды: | sidt источник |
Назначение: извлечение содержимого системного регистра idtr, содержащего значения базового адреса и размера дескрипторной таблицы прерываний IDT.
Синтаксис
Алгоритм работы:
команда sidt выполняет чтение содержимого системного регистра idtr в область памяти размером 48 бит. Структурно эти 48 бит представляют 16 бит размера и 32 бита значения базового адреса начала таблицы IDT в памяти.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду sidt применяют при работе системных программ с уровнем привилегий 0, в частности, при написании различных драйверов. В качестве операнда в команде указывается адрес области в формате 16+32. Младшее слово области — размер IDT, двойное слово по старшему адресу — значение базового адреса начала этой таблицы.
.286;структура для описания псевдодескрипторов gdtr и idtrpoint STRUClim dw 0adr dd 0 ENDS.datapoint_idt point .code...;читаем содержимое idtr sidt point_idt... |
См. также: урок 17 и команду lidt
SHL
(SHift logical Left)
Сдвиг логический операнда влево
Схема команды: | shl операнд,количество_сдвигов |
Назначение: логический сдвиг операнда влево.
Синтаксис
Алгоритм работы:
- сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса cf;
- одновременно слева в операнд вдвигается нулевой бит;
- указанные выше два действия повторяются количество раз, равное значению второго операнда.
Состояние флагов после выполнения команды:
OF | CF |
?r | r |
Применение:
Команда shl используется для сдвига разрядов операнда влево. Ее машинный код идентичен коду sal, поэтому вся информация, приведенная для sal, относится и к команде shl. Команда shl используется для сдвига разрядов операнда влево. Так же, как и для других сдвигов, значение второго операнда (счетчикк сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага of, значение которого имеет смысл только в операциях сдвига на один разряд:
- если of=1, то текущее значение флага cf и выдвигаемого слева бита операнда различны;
- если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают.
Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицу всякий раз при изменении знакового разряда операнда.
Команду shl удобно использовать для умножения целочисленных операндов без знака на степени 2. Кстати сказать, это самый быстрый способ умножения; умножить содержимое ax на 16 (2 в степени 4).
mov ax,17 shl ax,4 |
См. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shr
SHLD
(SHift Left Double word)
Сдвиг двойного слова влево
Схема команды: | shld приемник,источник,количество_сдвигов |
Назначение: логический сдвиг двойного слова влево.
Синтаксис
Алгоритм работы:
- сдвинуть операнд приемник влево на количество битов, определяемое операндом количество_сдвигов;
- одновременно сдвинуть операнд источник влево на количество битов, определяемое операндом количество_сдвигов. Важно заметить, что операнд источник только обеспечивает вдвигаемые в операнд приемник биты, сам он при этом не изменяется;
- выдвигаемые во время сдвига влево из операнда источник биты вдвигаются в операнд приемник с его правого края.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | r | r | ? | r | r |
Применение:
Команда shld используется для манипуляции битовыми строками длиной до 64 бит. Эту команду удобно использовать для быстрой вставки (или извлечения) битной строки в большую битную строку; при этом, что очень важно, не разрушается контекст (битное окружение) этих подстрок.
.386;извлечь старшую половину eax в bx без разрушения eax mov cl,16 shld ebx,eax,cl push bx shl ebx,cl shld eax,ebx,cl ;восстановим eax pop bx |
См. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shr, shrd
SHR
Сдвиг логический операнда вправо
ASCII-коррекция после сложения
Схема команды: | shr операнд,кол-во_сдвигов |
Назначение: логический сдвиг операнда вправо.
Синтаксис
Алгоритм работы:
- сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса cf;
- одновременно слева в операнд вдвигается нулевой бит;
- указанные выше два действия повторяются количество раз, равное значению второго операнда.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
?r | r | r | ? | r | r |
Применение:
Команда shr используется для логического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. В отличие от других команд сдвига, флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд.
Команду shr можно использовать для деления целочисленных операндов без знака на степени 2.
mov cl,4 shr eax,cl ;(eax) разделить на 2 в степени 4 |
См. также: урок 9 и команды rcr, rcl, ror, rol, sal, shl, sar
SHRD
(SHift Right Double word)
Сдвиг двойного слова вправо
Схема команды: | shrd приемник,источник,количество_сдвигов |
Назначение: логический сдвиг двойного слова вправо.
Синтаксис
Алгоритм работы:
- сдвинуть операнд приемник вправо на количество битов, определяемое операндом количество_сдвигов;
- одновременно сдвинуть операнд источник вправо на количество битов, определяемое операндом количество_сдвигов. Важно заметить, что операнд источник только обеспечивает вдвигаемые в операнд приемник биты, сам он при этом не изменяется;
- выдвигаемые вправо во время сдвига из операнда источник биты вдвигаются в операнд приемник с его левого конца.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | r | r | ? | r | r |
Применение:
Команда shrd используется для манипуляции битными строками длиной до 64 бит. Эту команду удобно использовать для быстрой вставки (или извлечения) битной строки в большую битную строку, при этом, что очень важно, не разрушается контекст (битное окружение) этих подстрок.
.386;разделить операнд размером 64 бит на степень 2op_l dd ... ;младшая часть операндаop_h dd ... ;старшая часть операнда... mov eax,op_h shrd op_l,eax,4 ;разделить операнд на 4;так как старшая часть операнда реально еще не сдвинулась,;то нужно привести ее в соответствие с результатом shr op_h,4 |
См. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shr, shld
STC
(Set Carry Flag)
Установка флага переноса
Схема команды: | stc |
Назначение: установка флага переноса cf в 1.
Синтаксис
Алгоритм работы:
установить флаг cf в единицу.
Состояние флагов после выполнения команды:
CF |
Применение:
Данная команда используется для установки флага cf в единицу. Такая необходимость может возникнуть при работе с командами сдвига, арифметическими командами или действиями по индикации ошибок в программах.
... stc ;cf=1... |
См. также: уроки 2, 8, 9 и команды cmc, clc
STD
(SeT Direction Flag)
Установка флага направления
Схема команды: | std |
Назначение: установка флага направления df в 1.
Синтаксис
Алгоритм работы:
установить флаг df в единицу.
Состояние флагов после выполнения команды:
DF |
Применение:
Данная команда используется для установки флага df в единицу. Такая необходимость может возникнуть при работе с цепочечными командами. Единичное состояние флага df вынуждает микропроцессор производить декремент регистров si и di при выполнении цепочечных операций.
... std ;df=1;смотрите материал урока 11 |
См. также: уроки 2, 11 и команду cld
STI
(SeT Interrupt flag)
Установка флага прерывания
Схема команды: | sti |
Назначение: установка флага прерывания if в единицу.
Синтаксис
Алгоритм работы:
установить флаг if в единицу.
Состояние флагов после выполнения команды:
IF |
Применение:
Данная команда используется для установки флага if в единицу. Такая необходимость может возникнуть при разработке программ обработки прерываний.
... sti ;if=1 |
См. также: урок 2, 15, 17 и команду cli