Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
SCAS
Влияние команды на флаги и форматы команды:
* |
|
|
|
* |
* |
* |
* |
* |
AE |
SCAS m8 |
Сравнить байт по адресу ES:(E)DI с AL |
8086 |
scasb |
AF |
SCAS m16 |
Сравнить слово по адресу ES:(E)DI с AX |
8086 |
scasw |
AF |
SCAS m32 |
Сравнить двойное слово по адресу ES:(E)DI с EAX |
Intel386 |
scasd |
AE |
SCASB |
Сравнить байт по адресу ES:(E)DI с AL |
8086 |
scasb |
AF |
SCASW |
Сравнить байт по адресу ES:(E)DI с AX |
8086 |
scasw |
AF |
SCASD |
Сравнить байт по адресу ES:(E)DI с EAX |
Intel386 |
scasd |
Описание:
Команда SCAS вычитает указанный операндом-назначением байт, слово или двойное слово в памяти из регистра AL, AX или EAX. Результат отбрасывается, устанавливаются только флаги. Операнд-источник адресуется регистровой парой ES:(E)DI, замещение сегмента невозможно.
Если атрибут размера адреса для этой команды равен 16 бит, то для адресации операнда-источника используется ES:DI, если атрибут размера адреса равен 32 бита, то используется ES:EDI.
Адрес сравниваемых данных определяется только содержимым индексного регистра (E)DI, но не самим операндом команды SCAS. Размер операнда команды определяется ее кодом и атрибутом размера операнда.
После завершения сравнения индексный регистр (E)DI автоматически изменяется. Если флаг DF равен 0 (была выполнена команда CLD), то регистр увеличивается; если флаг DF равен 1 (была выполнена команда STD), то регистр уменьшается. Регистр увеличивается или уменьшается на 1 при сравнении байтов, на 2 при сравнении слов, и на 4 при сравнении двойных слов.
Мнемоники SCASB, SCASW, SCASD являются синонимами команды SCAS для байтов, слов или двойных слов соответственно.
Команде SCAS может предшествовать префикс REPE или REPNE для сравнения блока из (E)CX байт, слов или двойных слов. Обратитесь к описанию REP для более подробной информации по этой операции.
Операция:
IF AddressSize = 16
THEN (использовать DI для dest-index);
ELSE (* AddressSize = 32 *) (Использовать EDI для dest-index);
FI;
IF (Команда байтового типа)
THEN
AL - [dest-index]; (* Сравнивает байт в AL и dest *)
IF DF = 0 THEN IncDec = 1; ELSE IncDec = -1; FI;
ELSE
IF OperandSize = 16
THEN
AX - [dest-index]; (* Сравнивает слово в AX и dest *)
IF DF = 0 THEN IncDec = 2; ELSE IncDec = -2; FI;
ELSE
EAX - [dest-index]; (* Сравнивает двойное слово в EAX и dest *)
IF DF = 0 THEN IncDec = 4; ELSE IncDec = -4; FI;
FI;
FI;
dest-index = dest-index + IncDec;
Особые ситуации защищенного режима:
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегменте ES или нулевой селектор.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегменте ES.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru