Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
OUTS
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
6E |
OUTS DX,m8 |
Вывести байт из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel286 |
outsb |
6F |
OUTS DX,m16 |
Вывести слово из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel286 |
outsw |
6F |
OUTS DX,m32 |
Вывести двойное слово из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel386 |
outsd |
6E |
OUTSB |
Вывести байт из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel286 |
outsb |
6F |
OUTSW |
Вывести слово из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel286 |
outsw |
6F |
OUTSD |
Вывести двойное слово из ячейки памяти DS:(E)SI в порт в/в по адресу в DX |
Intel386 |
outsd |
Описание:
Команда OUTS пересылает байт, слово или двойное слово из ячейки памяти, адресуемой индексным регистром-источником, в порт вывода, адресуемый регистром DX. Если атрибута размера адреса для этой команды равен 16 бит, то в качестве индексного регистра-источника используется регистр SI. Если атрибута размера адреса равен 32 бита, то в качестве индексного регистра-источника используется регистр ESI.
Команда OUTS не позволяет указывать номер порта в качестве непосредственного значения. Порт может адресоваться только через регистр DX. Адрес источника данных определяется содержимым индексного регистра-источника (E)SI и сегментным регистром DS. Сегментный регистр может быть переопределен префиксом замещения сегмента.
После пересылки данных индексный регистр-источник автоматически изменяется. Если флаг DF равен 0 (была выполнена команда CLD), то регистр увеличивается, если флаг DF равен 1 (была выполнена команда STD), то регистр уменьшается. Увеличение или уменьшение происходит на 1, если пересылается байт, на 2, если пересылается слово, на 4, если пересылается двойное слово.
Мнемоники OUTSB, OUTSW и OUTSD являются синонимами команды OUTS для байта, слова и двойного слова соответственно.
Команде OUTS может предшествовать префикс REP для вывода блока из (E)CX байтов, слов или двойных слов.
Операция:
IF AdressSize = 16
THEN Использовать SI для source-index;
ELSE (* AdressSize = 32 *)
Использовать ESI для source-index;
FI;
IF (PE = 1) AND ((VM = 1) OR (CPL > IOPL))
THEN (* Виртуальный-8086 режим, или защищенный режим с CPL > IOPL *)
IF NOT I-O-Permission(DEST, width(DEST))
THEN #GP(0);
FI;
FI;
IF (Команда байтового типа)
THEN
[DX] = [source-index]; (* Записать байт в простанство ввода-вывода *)
IF DF = 0 THEN IncDec = 1 ELSE IncDec = -1; FI;
ELSE
IF OperandSize = 16
THEN
[DX] = [source-index]; (* Записать слово в простанство ввода-вывода *)
IF DF = 0 THEN IncDec = 2 ELSE IncDec = -2; FI;
ELSE (* OperandSize = 32 *)
[DX] = [source-index]; (* Записать двойное слово в простанство адрес ввода-вывода *)
IF DF = 0 THEN IncDec = 4 ELSE IncDec = -4; FI;
FI;
FI;
source-index = source-index + IncDec;
Особые ситуации защищенного режима:
#GP(0), если значение текущего уровня привилегий CPL больше по значению уровеня привилегий ввода-вывода IOPL и любой из соответствующих порту битов разрешения ввода-вывода в TSS равен 1.
#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
Особые ситуации режима V86:
#GP(0), если любой из соответствующих порту битов разрешения ввода-вывода в TSS равен 1.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Замечание:
По окончании выполнения команды OUTS процессоры, начиная с Pentium, проверяют, установлен ли сигнал на выводе EWBE# в активное состояние, задерживая выполнение следующей команды до его установления. Заметьте, что команда может быть выбрана с упреждением, даже если EWBE# не активен, но она не выполняется до тех пор, пока сигнал отсутствует. В более ранних моделях процессоров вывод EWBE# отсутствует и никаких задержек не производится.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru