IN
从端口输入
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
E4 ib | IN AL, imm8 | I | 有效 | 有效 | Imm8 I/O端口地址输入字节输入AL. |
E5 ib | IN AX, imm8 | I | 有效 | 有效 | Imm8 I/O端口地址输入到AX的单词. |
E5 ib | IN EAX, imm8 | I | 有效 | 有效 | 从 imm8 I/O 端口地址输入dword 到 EAX. |
EC | IN AL,DX | ZO | 有效 | 有效 | 从 DX 的 I/O 端口输入字节到 AL. |
ED | IN AX,DX | ZO | 有效 | 有效 | 从 DX 的 I/O 端口输入到 AX 的单词. |
ED | IN EAX,DX | ZO | 有效 | 有效 | 从 DX 的 I/O 端口输入双词到 EAX. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
I
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 前缀 。 |