In和Out指令

时间:2021-12-17 14:21:49
In和Out
OUT 0FAH,AL(它是指从AL中输出一个字节到0FAH的一个端口吗?)
OUT DX,AL  
OUT 0FAH,AX(AX是一个字为什么也能输出到0FAH所指的8位端口中呢?)
OUT 03F8H,AL(这个指令有错误为什么?)
 这是因为在OUT指令中直接用数字寻址,端口号只能是0到FFH,而上面这条指令应改为
MOV DX 03F8H ;只能放在DX,这是规定。
OUT DX,AL
-----------------------------------------
OUT 0FAH,AL(它是指从AL中输出一个字节到0FAH的一个端口吗?)
是的
---------------------------------------
OUT 0FAH,AX(AX是一个字为什么也能输出到0FAH所指的8位端口中呢?)
这条指令将AL中的数据放在0FAH,将AH中的数据放在0FBH。
这四条指令主要就是说明这个OUT指令的不同用法,学这些指令不用硬记每条指令的各种用法,只要根据规定的寻址方式。
IN(Input) 输入
OUT(Output) 输出
这组指令只限于使用累加器AX或AL传送信息.
IN 输入指令长格式为:   IN  AL,PORT(字节)  
                       IN  AX,PORT(字)
执行的操作: (AL)<-(PORT)(字节)        
           (AX)<-(PORT+1,PORT)(字)
短格式为:   IN   AL,DX(字节)        
            IN AX,DX(字)
执行的操作: AL<-((DX))(字节)        
           AX<-((DX)+1,DX)(字).
OUT 输出指令长格式为:   OUT  PORT,AL(字节)        
                         OUT  PORT,AX(字)
执行的操作: (PORT)<-(AL)(字节)        
           (PORT+1,PORT)<-(AX)(字)
短格式为:   OUT  DX,AL(字节)        
            OUT DX,AX(字)
执行的操作: ((DX))<-(AL)(字节)        
           ((DX)+1,(DX))<-AX(字)  
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. 
IN,OUT端口读写指令
端口是主机与外设进行数据交换的。(外设接口电路有专用于数据交互的寄存器。为了与CPU中的寄存器相区别,称之为端口)。端口有数据端口,状态端口和控制端口3种。
PC机给予每一个端口分配了一个地址(称为端口号),形成一个独立于内存空间的I/O地址空间。在8086/8088中,端口地址的范围是0000至FFFF。
CPU对外设的操作通过专门的端口读写指令来完成。读端口用IN指令,写端口用OUT指令。
IN ACC,PORT;从端口PORT读取数据到ACC;
PORT可以是立即数,也可以是DX。
ACC为AL时,从PORT读取1字节数据到AL
    ACC为AX时,从PORT读取2字节数据到AX
OUT PORT,ACC;将ACC的数据写入端口PORT;
例子:
IN AL,21H;表示从21H端口读取一字节数据到AL
IN AX,21H;表示从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH
MOV DX,379H
    IN   AL,DX;从端口379H读取1字节到AL
    OUT 21H,AL;将AL的值写入21H端口
    OUT 21H,AX;将AX的值写入端口地址21H开始的连续两个字节。(port[21H]=AL,port[22h]=AH)
MOV DX,378H
    OUT DX,AX;将AH和AL分别写入端口379H和378H