7.2.1I/0指令 I/0指令共有四条,所有I/0端口与CPU之间的通信都是由这 四条指令完成。 1.IN指令 格式:IN{AL|AX|EAX},{端口地址IDX 功能:将I/0端口中的信息读入到累加器中。 说明:累加器为AL时,从指定端口中读出1个字节送给AL; 累加器为AX时,从指定端口中读出1个字节送给AL,从下 一端口地址中读出另1个字节送给AH;累加器为EAX时,连 续读出从指定地址开始的4个端口中的内容送给EAX。 当端口号小于256时,在IN指令中可以直接给出端口号。 ● 当端口号大于等于256时,必须先把端口号传送到DX寄存 器中,然后执行IN指令。 o8888 16
7.2.1 I/O 7.2.1 I/O指令 I/O指令共有四条,所有I/O端口与CPU之间的通信都是由这 四条指令完成。 1.IN指令 格式:IN {AL|AX|EAX} IN {AL|AX|EAX},{端口地址|DX} 功能:将I/O端口中的信息读入到累加器中。 说明:累加器为AL时,从指定端口中读出 从指定端口中读出1个字节送给AL; 累加器为AX时,从指定端口中读出1个字节送给AL,从下 一端口地址中读出另 一端口地址中读出另1个字节送给AH;累加器为EAX时,连 续读出从指定地址开始的4个端口中的内容送给EAX。 当端口号小于256时,在IN指令中可以直接给出端口号 指令中可以直接给出端口号。 当端口号大于等于256时,必须先把端口号传送到DX寄存 器中,然后执行IN指令。 16
例7.1:IN指令使用举例 (1)从端口地址为61H的端口上读取一个字节: IN AL,61H (2)从端口地址为379H的端口上读取一个字节: MOV DX,379H IN AL,DX (3)读取60H,61H两个端口: IN AX,60H (4)从端口地址为60H、61H、62H、63H的端口上读取一个双字: IN EAX,60H ● (5)从端口地址为0E000H,0E001H的端口上读取一个字: MOV DX,0E000H IN AX,DX 17
例7.1:IN指令使用举例 ⑴从端口地址为61H的端口上读取一个字节: IN AL,61H ⑵从端口地址为379H的端口上读取一个字节: MOV DX, 379H IN AL,DX ⑶读取60H,61H两个端口: IN AX,60H ⑷从端口地址为60H 、61H 、62H 、63H的端口上读取一个双字 的端口上读取一个双字: IN EAX,60H ⑸从端口地址为0E000H,0E001H的端口上读取一个字 的端口上读取一个字: MOV DX,0E000H IN AX,DX 17
2.0UT指令 格式:OUT{端口地址IDX),{ALIAXIEAX) 功能:将累加器中的信息输出到I0端口。 说明:累加器为AL时,AL中的内容输出到指定端口中;累加 器为AX时,AL中的内容输出到指定端口中,AH中的内容输 出到下一端口中;累加器为EAX时,EAX中的四字节内容依 次输出到指定地址开始的4个端口中。 当端口号大于等于256时,必须先把端口号放到DX寄存器 中。当端口号小于256时,在0UT指令中可以直接给出端口●● 号。 888 18
2.OUT指令 格式:OUT{端口地址|DX},{AL|AX|EAX} {AL|AX|EAX} 功能:将累加器中的信息输出到I/O端口。 说明:累加器为AL时,AL中的内容输出到指定端口中 中的内容输出到指定端口中;累加 器为AX时,AL中的内容输出到指定端口中,AH中的内容输 出到下一端口中 出到下一端口中;累加器为EAX时,EAX中的四字节内容依 中的四字节内容依 次输出到指定地址开始的4个端口中。 当端口号大于等于256时,必须先把端口号放到DX寄存器 中。当端口号小于256时,在OUT指令中可以直接给出端口 号。 18
例7.2:0UT指令使用举例 (1)将AL中的内容输出到61H端口: OUT 61H,AL (2)将AL中的内容输出到37AH端口: MOV DX,37AH OUT DX,AL (3)将AL和AH中的内容输出到3CEH,3CFH端口: MOV DX,3CEH OUT DX,AX .888 19
例7.2:OUT指令使用举例 ⑴将AL中的内容输出到 中的内容输出到61H端口: OUT 61H ,AL ⑵将AL中的内容输出到 中的内容输出到37AH端口: MOV DX, 37AH OUT DX, AL ⑶将AL和AH中的内容输出到3CEH,3CFH端口: MOV DX, 3CEH OUT DX, AX 19
3.INS指令 格式:INSB/INSW/INSD 功能;将I/0端口中的信息读入到ES:[BDI]指向的内存单元。 中; (1)使用INSB时,从端口号为DX的端口中读出1个字节送给 ES:[EDI]单元; (2)使用INSW时,从端口号为DX和DX+1的端口中分别读出2 个字节送给ES:[EDI],ES:[EDI+1]单元; (3)使用INSD时,从端口号为DX,DX+1,DX+2, DX+3的端 口中分别读出4个字节送给ES:[EDI],ES:[EDI+1],ES: [BDI+2],ES:[EDI+3]单元; INS指令在读出端口中的信息并保存到内存单元后,自动调 ●g 整DI。DF=0时,EDI分别增加1,2,4;DF=1时,EDI分别 减去1,2,4; 结合RBP前缀,INS指令可以对I/0端口连续读取ECX次。8.88 20
3.INS指令 格式:INSB/INSW/INSD 功能;将I/O端口中的信息读入到ES:[EDI]指向的内存单元 中; (1)使用INSB时,从端口号为DX的端口中读出1个字节送给 ES:[EDI]单元; (2)使用INSW时,从端口号为DX和DX+1的端口中分别读出2 个字节送给ES:[EDI],ES:[EDI+1] [EDI+1]单元; (3)使用INSD时,从端口号为DX,DX+1,DX+2,DX+3的端 口中分别读出4个字节送给ES:[EDI],ES:[EDI+1] [EDI+1],ES: [EDI+2],ES:[EDI+3]单元; INS指令在读出端口中的信息并保存到内存单元后,自动调 整EDI。DF=0时,EDI分别增加1,2,4;DF=1时,EDI分别 减去1,2,4; 结合REP前缀,INS指令可以对I/O端口连续读取ECX次。 20