IN

从端口输入

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
E4 ibIN AL, imm8I有效有效Imm8 I/O端口地址输入字节输入AL.
E5 ibIN AX, imm8I有效有效Imm8 I/O端口地址输入到AX的单词.
E5 ibIN EAX, imm8I有效有效从 imm8 I/O 端口地址输入dword 到 EAX.
ECIN AL,DXZO有效有效从 DX 的 I/O 端口输入字节到 AL.
EDIN AX,DXZO有效有效从 DX 的 I/O 端口输入到 AX 的单词.
EDIN EAX,DXZO有效有效从 DX 的 I/O 端口输入双词到 EAX.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

I

  1. imm8指令后的立即数字节

实测开销

正在从 arch-data 加载实测数据...

说明

复制由第二个 操作数 (源操作数) 指定的 I/O 端口到 目标操作数 (第一个 操作数) 的值. 源操作数可以是字节即时或DX注册;目标操作数可以是注册AL,AX,或EAX,视访问端口大小而定(分别为8,16或32位). 使用DX寄存器作为源操作数允许访问0到65,535的I/O端口地址;使用字节即时允许访问I/O端口地址0到255.

当访问8位I/O端口时,操作码决定端口大小;当访问16位和32位I/O端口时,操作数大小属性决定端口大小. 在机器代码级别上,I/O指令在访问8位I/O端口时较短. 在这里,端口地址的上八位位将是0.

此指令仅用于访问位于处理器I/O地址空间的I/O端口. 有关访问I/O地址空间I/O端口的更多信息,见Intel(R)64和IA-32 Architecture Software开发者手册第1卷第20章"输入/输出".

此指令的操作在非64位模式和64位模式中是相同的.

行动

IF ((PE = 1) and ((CPL > IOPL) or (VM = 1)))

    THEN (* Protected mode with CPL > IOPL or virtual-8086 mode *)

        IF (Any I/O Permission Bit for I/O port being accessed = 1)

                THEN (* I/O operation is not allowed *)
                      #GP(0);

                ELSE ( * I/O operation is allowed *)
                      DEST := SRC; (* Read from selected I/O port *)

          FI;
    ELSE (Real Mode or Protected Mode with CPL  IOPL *)

          DEST := SRC; (* Read from selected I/O port *)
FI;

受影响的旗帜

None.

异常

保护模式
#GP(0)如果 CPL 大于(拥有较少的特权) I/O 特权级(IOPL),并且对于正在访问的 I/O 端口,在 TSS 中对应的 I/O 许可位是 1. #PF(fault-code) 如果 页面错误 发生.
#UD如果使用 LOCK 前缀 。
实地址模式
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#GP(0)如果正在访问的 I/O 端口的 TSS 中的任何 I/O 许可位是 1. #PF(fault-code) 如果 页面错误 发生的话.
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#GP(0)如果 CPL 大于(拥有较少的特权) I/O 特权级(IOPL),并且对于正在访问的 I/O 端口,在 TSS 中对应的 I/O 许可位是 1. #PF(fault-code) 如果 页面错误 发生.
#UD如果使用 LOCK 前缀 。

来源