Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
IN
Влияние команды на флаги и форматы команды:
E4 ib |
IN AL,imm8 |
Загрузить байт из порта в/в imm8 в регистр AL |
8086 |
in al,60h |
E5 ib |
IN AX,imm8 |
Загрузить слово из порта в/в imm8 в регистр AL |
8086 |
in ax,00h |
E5 ib |
IN EAX,imm8 |
Загрузить двойное слово из порта в/в imm8 в регистр AL |
Intel386 |
in eax, 03h |
EC |
IN AL,DX |
Загрузить байт из порта в/в DX в регистр AL |
8086 |
in al,dx |
ED |
IN AX,DX |
Загрузить слово из порта в/в DX в регистр AL |
8086 |
in ax,dx |
ED |
IN EAX,DX |
Загрузить двойное слово из порта в/в DX в регистр AL |
Intel386 |
in eax,dx |
Описание:
Команда IN пересылает байт, слово или двойное слово данных из порта, адресуемого при помощи второго операнда, в регистр (AL, AX или EAX), указанный первым операндом. Адрес порта может задаваться вторым байтом команды imm8 или содержимым регистра DX. Таким образом, возможно обращение к 256 портам, адреса которых фиксированы (байт imm8), или к 65536 портам, адреса которых могут изменяться путем перезагрузки содержимого регистра DX. При работе с 16-разрядными данными число адресуемых портов уменьшается вдвое, а их адресация должна производиться четными числами: 0, 2, 4 ... 254 для фиксированных портов; 0, 2, 4 ... 65534 для изменяемых портов. Соответственно для 32-разрядных данных число портов сокращается еще вдвое, а их адресация производится числами кратными четырем: 0, 4, 8 ... 252 ... 65532. Таким образом, номера портов должны быть выровнены по границам передаваемых данных согласно их разрядности: 1, 2 или 4 байта. В этом случае пересылка осуществляется за один цикл. Если заданный номер 16 или 32-разрядного порта имеет невыровненное значение, то для передачи данных требуется дополнительный цикл шины.
Операция:
IF ( (CR0.PE = 1) AND ( (CPL > EFLAGS.IOPL) OR (EFLAGS.VM = 1) ) )
THEN (* Виртуальный-8086 режим, или защищенный режим с CPL > IOPL *)
IF (Любой из соответствующих порту битов карты в/в = 1)
THEN (* Операция в/в недопустима *)
#GP(0);
ELSE (* Операция в/в разрешена *)
DEST = [SRC]; (* Читает из адресного пространства ввода/вывода *)
FI;
ELSE (Режим реальной адресации или защищенный режим с CPL ≤ EFLAGS.IOPL *)
DEST = [SRC]; (* Читает из адресного пространства ввода/вывода *)
FI;
Особые ситуации защищенного режима:
#GP(0), если значение текущего уровня привилегий CPL больше (имеет меньше привилегий), чем уровень привилегий ввода-вывода IOPL, и любой из соответствующих битов разрешения ввода-вывода в TSS равен 1.
Особые ситуации режима реальной адресации:
Нет.
Особые ситуации режима V86:
#GP(0), если любой из соответствующих битов разрешения ввода-вывода в TSS равен 1.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru