发新话题
打印

I/O指令

I/O指令


I/O指令 ! z( h6 H; \: N( e* C/ y0 r
    当采用I/O独立编址时,微处理器必须设置I/O指令。Intel的x86微处理器支持I/0 独立编址,它们都具有I/0指令,都使用最低的16位地址(A15~A0)表示I/0端口地址。16位微处理器(如8086/8088)支持字节型和字型I/O操作,32位微处理器(80386及以后的微处理器)还支持双字型I/0操作。x86微处理器的I/0指令有四种:IN指令(从端口输入数据)、OUT指令(输出数据至端口)、INS指令(从端口输入串)和OUTS指令(输出串至端口)。
9 Z! Z. n: w9 {! S0 X+ c( h# o) e6 T前两种为基本的I/O指令,所有的x86处理器都支持,后两种属于串操作指令,从80386开始的x86处理器才予以支持(其中一部分80286已能支持)。I/O指令的寻址方式有两种:一种是直接寻址,地址范围是十进制的0~255;二是Dx寄存器间接寻址,Dx寄存器的当前内容作为端口地址(事先应将端口地址值送人DX)。DX是16位寄存器,可表示的地址范围为0~65535,所以,x86微处理器I/0空间最大为64 KB,说得确切些,x86微处理器最多支持64K个字节型端口,或者说,最多支持32 K个字型端口。对于32位的x86微处理器还可认为最多支持16 K个双字型端口。当然在一个微机系统中3种(字节型、字型、双字型)端口可以同时使用。
) w9 L% {6 X+ P  ?" d- l    表.4.1列出了Intel的x86微处理器的基本I/0指令及其功能。表中n为O一255(十进制) 之间的一个数,EAX为Intel的32位微处理器中的一个32位通用寄存器,方括号表示端口。
7 d# T* b# D, c+ u9 V
  x+ d0 ]$ Y/ J7 D1 H/ A$ U/ C8 P8 \) B& u

' y* S/ T6 a; R- ?( f
3 p* |7 \/ M: m* J 7 Y, t6 @3 L9 V2 n. Y9 c" {, h# |( P4 c
    INS指令和OUTS指令各有3条,分别进行字节串、字串和双字串的传送。下面是对这两种共6条指令的简要说明: $ @& K: E. a4 N8 z3 j6 k0 F
    ①INSB指令:从DX的内容所指定的端口输入一个字节到Es:DI指定的存储单元,DI的内容增1或减1(取决于标志寄存器中的方向标志DF)。
; Q; c6 L6 P, B' N8 _    ②INSW指令:从DX的内容所指定的字端口输入一个字到Es:DI指定的字单元,DI的内容增2或减2。 3 s$ z7 S% e9 k5 Z+ g
    ③INSD指令:从DX的内容所指定的双字端口输入一个字到Es:EDI指定的字单元,EDI的内容增4或减4。
( f% H9 b2 ]' W* `! V- s( p! n    ④OUTB指令:将Ds:sI指定的字节存储单元的内容输出到Dx指定的字节端口,sI的内容增1或减1。 % ^/ f- U& i/ L
  ⑤OUTW指令:将DS:sI指定的字存储单元的内容输出到DX指定的字端口,sI的内容增2或减2。
: @3 q, z7 o0 A* K& s$ r/ t; K  ⑥OUTD指令:将Ds:ESI指定的双字存储单元的内容输出到DX指定的双字端口,EsI 的内容增4或减4。



点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹

TOP

发新话题