Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
INS
Влияние команды на флаги и форматы команды:
6C |
INS m8,DX |
Загрузить байт из порта в/в DX в память по адресу ES:(E)DI |
Intel286 |
insb |
6D |
INS m16,DX |
Загрузить слово из порта в/в DX в память по адресу ES:(E)DI |
Intel286 |
insw |
6D |
INS m32,DX |
Загрузить двойное слово из порта в/в DX в память по адресу ES:(E)DI |
Intel386 |
insd |
6C |
INSB |
Загрузить байт из порта в/в DX в память по адресу ES:(E)DI |
Intel286 |
insb |
6D |
INSW |
Загрузить слово из порта в/в DX в память по адресу ES:(E)DI |
Intel286 |
insw |
6D |
INSD |
Загрузить двойное слово из порта в/в DX в память по адресу ES:(E)DI |
Intel386 |
insd |
Описание:
Команда INS пересылает данные из порта, заданного значением в регистре DX, в байт, слово или двойное слово в памяти по адресу ES:(E)DI. В качестве сегментного регистра всегда используется ES, он не может быть переопределен префиксами замещения сегмента. Индексный регистр-назначение (dest-index) — это регистр DI, если атрибут размера адреса команды равен 16 бит, или регистр EDI, если атрибут размера адреса равен 32 бита.
Команда INS не позволяет указывать номер порта в качестве непосредственного значения. Порт должен адресоваться через значение регистра DX.
После завершения пересылки данных регистр DI или EDI автоматически изменяется. Если флаг DF равен нулю (была выполнена команда CLD), то регистр DI или EDI увеличивается, если флаг DF равен единице (была выполнена команда STD), то регистр DI или EDI уменьшается. Регистр (E)DI уменьшается или увеличивается на 1, если был введен байт, на 2 — если слово, на 4 — если двойное слово.
Мнемоники INSB, INSW, INSD — синонимы мнемоники INS m,DX для байта, слова или двойного слова, соответственно. Команде INS может предшествовать префикс REP для ввода блока из (E)CX байт или слов. Обратитесь к описанию REP для подробного рассмотрения такой операции.
Операция:
IF AdressSize = 16
THEN Использовать DI для dest-index;
ELSE (* AdressSize = 32 *)
Использовать EDI для dest-index;
FI;
IF (CR0.PE = 1) AND ( (EFLAGS.VM = 1) OR (CPL > EFLAGS.IOPL) )
THEN (* Виртуальный-8086 режим, или защищенный режим с CPL > EFLAGS.IOPL *)
IF NOT I-O-Permission (SRC, width(SRC))
THEN #GP(0);
FI;
FI;
IF (Команда пересылки байта)
THEN
ES:[dest-index] = [DX]; (* Чтение байта по DX из адресного пространства ввода/вывода *)
IF DF = 0 THEN IncDec = 1 ELSE IncDec = -1; FI;
ELSE
IF OperandSize = 16
THEN
ES:[dest-index] = [DX]; (* Чтение слова по DX из адресного пространства ввода/вывода *)
IF DF = 0 THEN IncDec = 2 ELSE IncDec = -2; FI;
ELSE (* OperandSize = 32 *)
ES:[dest-index] = [DX]; (* Чтение двойного слова по DX из адресного пространства ввода/вывода *)
IF DF = 0 THEN IncDec = 4 ELSE IncDec = -4; FI;
FI;
FI;
dest-index = dest-index + IncDec;
Особые ситуации защищенного режима:
#GP(0), если значение текущего уровня привилегий CPL больше (имеет меньше привилегий), чем уровень привилегий ввода/вывода IOPL, и любой из соответствующих битов разрешения ввода/вывода в TSS равен 1.
#GP(0), если операнд-назначение находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегменте ES или нулевой селектор.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда-назначения находится вне пространства эффективных адресов в сегменте ES.
Особые ситуации режима V86:
#GP(0), если любой из соответствующих битов разрешения ввода/вывода в TSS равен 1.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru