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

Наши рекомендации