InOut <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

OUT 0FAH,AL(它是指从AL中输出一个字节到0FAH的一个端口吗?)

OUT DX,AL  

OUT 0FAH,AXAX是一个字为什么也能输出到0FAH所指的8位端口中呢?)

OUT 03F8H,AL(这个指令有错误为什么?

   

 这是因为在OUT指令中直接用数字寻址, 端口号只能是0FFH ,而上面这条指令应改为

MOV DX 03F8H ;只能放在DX,这是规定。

OUT DX,AL

-----------------------------------------

OUT 0FAH,AL(它是指从AL中输出一个字节到0FAH的一个端口吗?)

是的

---------------------------------------

OUT 0FAH,AXAX是一个字为什么也能输出到0FAH所指的8位端口中呢?)

这条指令将AL中的数据放在0FAH,AH中的数据放在0FBH

这四条指令主要就是说明这个OUT指令的不同用法,学这些指令不用硬记每条指令的各种用法,只要根据规定的寻址方式。

IN(Input) 输入

OUT(Output) 输出

这组指令只限于使用累加器AXAL传送信息.

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机里,外部设备最多可有65536I/O端口,端口(即外设的端口地址)0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从00000FFFFH),然后再用INOUT指令来传送信息

端口是主机与外设进行数据交换的。(外设接口电路有专用于数据交互的寄存器。为了与CPU中的寄存器相区别,称之为端口)。端口有数据端口,状态端口和控制端口3种。

PC机给予每一个端口分配了一个地址(称为端口号),形成一个独立于内存空间的I/O地址空间。在8086/8088中,端口地址的范围是0000FFFF

CPU对外设的操作通过专门的端口读写指令来完成。读端口用IN指令,写端口用OUT指令。

IN ACCPORT;从端口PORT读取数据到ACC

PORT可以是立即数,也可以是DX

ACCAL时,从PORT读取1字节数据到AL
     ACCAX时,从PORT读取2字节数据到AX

OUT PORTACC;将ACC的数据写入端口PORT

例子:

IN AL21H;表示从21H端口读取一字节数据到AL

IN AX21H;表示从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH

MOV DX379H
     IN     ALDX;从端口379H读取1字节到AL

     OUT 21HAL;将AL的值写入21H端口
     OUT 21HAX;将AX的值写入端口地址21H开始的连续两个字节。(port[21H]=ALport[22h]=AH

MOV DX378H
     OUT DXAX;将AHAL分别写入端口379H378H