数据传送类指令
- 格式:doc
- 大小:50.50 KB
- 文档页数:26
传送及比较指令总结传送指令是计算机系统中常用的一类指令,用于将数据从一个位置移动到另一个位置。
这些指令通常用于数据的复制、转移和重排等任务。
在本文中,我将总结一些常见的传送指令,并比较它们的异同。
1.MOV指令:MOV (Move) 指令用于将数据从一个位置复制到另一个位置。
它可以在寄存器之间、寄存器和内存之间、寄存器和端口之间进行数据的传送。
MOV 指令通常具有两个操作数,一个目标操作数和一个源操作数。
例如,`MOV AX, BX` 将寄存器 BX 中的值复制到寄存器 AX 中。
MOV 指令在大多数计算机体系结构中都是支持的,因为它是一种非常基本和常见的操作。
2.LDR和STR指令:LDR (Load) 和 STR (Store) 指令用于将数据从内存中加载到寄存器或将数据从寄存器存储到内存中。
这些指令主要在ARM架构中使用。
LDR指令将内存中的数据加载到寄存器中,例如,`LDR R0, [R1]` 将 R1 寄存器中的地址所对应的内存单元中的数据加载到 R0 寄存器中。
STR 指令则将寄存器中的数据存储到内存中,例如,`STR R0, [R1]` 将 R0 寄存器中的数据存储到 R1 寄存器中的地址所对应的内存单元中。
3.PUSH和POP指令:PUSH指令用于将数据压入栈中,而POP指令用于从栈中弹出数据。
这两个指令通常用于实现函数调用和中断处理等操作。
PUSH指令将数据放入栈顶,然后栈指针下移;而POP指令则将栈顶数据读取到寄存器中,并将栈指针上移。
例如,`PUSHAX`将AX寄存器中的数据压入栈中,`POPAX`将栈顶数据弹出到AX寄存器中。
4.XCHG指令:XCHG (Exchange) 指令用于交换两个操作数的值。
这个指令可以用于两个寄存器之间的值交换,或者寄存器和内存之间的交换。
例如,`XCHG AX, BX` 将寄存器 AX 和 BX 中的数据进行交换。
XCHG 指令常用于实现数据交换、排序和互斥访问等场景。
ARM指令集中的数据传送指令主要用于在寄存器和内存之间传输数据。
以下是一些常用的数据传送指令:
1. LDR - 加载寄存器指令。
用于从内存加载数据到寄存器。
2. STR - 存储寄存器指令。
用于将数据从寄存器存储到内存。
3. LDRB - 加载字节指令。
用于从内存加载一个字节的数据到寄存器。
4. STRB - 存储字节指令。
用于将一个字节的数据从寄存器存储到内存。
5. LDRH - 加载半字指令。
用于从内存加载一个半字的数据到寄存器。
6. STRH - 存储半字指令。
用于将一个半字的数据从寄存器存储到内存。
7. LDRD - 加载双字指令。
用于从内存加载一个双字的数据到寄存器。
8. STRD - 存储双字指令。
用于将一个双字的数据从寄存器存储到内存。
9. PUSH - 入栈指令。
用于将寄存器的值推送到堆栈中。
10. POP - 出栈指令。
用于从堆栈中弹出值并将其存储到寄存器中。
这些指令可以配合使用 ARM 的地址计算和跳转指令来完成更复杂的内存操作和数据处理任务。
请注意,具体支持的指令可能会因ARM 架构版本和处理器型号而有所不同。
数据传送指令数据传送指令包括数据的传送、交换、堆栈数据的压入与弹出,是最基本、使用率最高的一类指令。
助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八种。
1.MOV类指令及功能(16条)这类指令的功能是从源操作数到目的操作数的数据传送。
MOV A, Rn ;Rn→A,寄存器Rn的内容送到累加器AMOV A, direct ;(direct)→A,直接地址中的内容送AMOV A, @Ri ;(Ri)→A,Ri间址的内容送AMOV A, #data ;data→A,立即数送AMOV Rn,, A ;A→Rn,累加器A中的内容送寄存器RnMOV Rn, direct ;(direct)→Rn;直接地址中的内容送RnMOV Rn, #data ;data→Rn;立即数送RnMOV direct, A ;A→(direct),A中的内容送入直接地址中MOV direct, Rn ;Rn→(direct),寄存器内容送入直接地址中MOV direct, direct ;(direct) →(direct),源操作数直接地址的内容送入;目的操作数的直接地址中MOV direct, @Ri ;(Ri)→(direct),Ri间址内容送入直接地址中MOV direct, #data ;data→(direct),立即数送入直接地址中MOV @Ri, A ;A→(Ri),A中内容送到Ri间址单元中MOV @Ri, direct ;(direct)→(Ri),直接地址中内容送入Ri间址单元中MOV @Ri, #data ;data→(Ri),立即数送入Ri间址单元中MOV DPTR, #data16 ;data16→DPTR,16位常数送入数据指针DPTR中,高8 ;位送入DPH,低8位送入DPH,低8位送入DPL中从上述指令可以看出目的操作数有A累加器、Rn寄存器、直接地址direct及间接地址@Ri,源操作数除此之外还多一种立即数data。
(数据传递类指令)MOV A,Rn 寄存器传送到累加器 1 1MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8) 1 1 MOV A,#data 立即数传送到累加器 2 1MOV Rn,A 累加器传送到寄存器 1 1MOV Rn,direct 直接地址传送到寄存器 2 2 MOV Rn,#data 累加器传送到直接地址 2 1 MOV direct,Rn 寄存器传送到直接地址 2 1 MOV direct,direct 直接地址传送到直接地址 3 2MOV direct,A 累加器传送到直接地址 2 1 MOV direct,@Ri 间接RAM 传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 直接地址传送到直接地址 1 2 MOV @Ri,direct 直接地址传送到间接RAM 2 1 MOV @Ri,#data 立即数传送到间接RAM 2 2 MOV DPTR,#data16 16 位常数加载到数据指针 3 1MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16) 1 2 PUSH direct 直接地址压入堆栈 2 2POP direct 直接地址弹出堆栈 2 2XCH A,Rn 寄存器和累加器交换 1 1XCH A, direct 直接地址和累加器交换 2 1XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD A, @Ri 间接RAM 和累加器交换 1 1低4 位字节(算术运算类指令)INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接地址加1 2 1INC @Ri 间接RAM 加1 1 1INC DPTR 数据指针加1 1 2DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC direct 直接地址减1 2 2DEC @Ri 间接RAM 减1 1 1MUL AB 累加器和B 寄存器相乘 1 4DIV AB 累加器除以B 寄存器 1 4DA A 累加器十进制调整 1 1ADD A,Rn 寄存器与累加器求和 1 1ADD A,direct 直接地址与累加器求和 2 1ADD A,@Ri 间接RAM 与累加器求和 1 1ADD A,#data 立即数与累加器求和 2 1ADDC A,Rn 寄存器与累加器求和(带进位) 1 1 ADDC A,direct 直接地址与累加器求和(带进位) 2 1ADDC A,@Ri 间接RAM 与累加器求和(带进位) 1 1ADDC A,#data 立即数与累加器求和(带进位) 2 1 SUBB A,Rn 累加器减去寄存器(带借位) 1 1 SUBB A,direct 累加器减去直接地址(带借位) 2 1 SUBB A,@Ri 累加器减去间接RAM(带借位) 1 1 SUBB A,#data 累加器减去立即数(带借位) 2 1 (逻辑运算类指令)ANL A,Rn 寄存器“与”到累加器 1 1ANL A,direct 直接地址“与”到累加器 2 1 ANL A,@Ri 间接RAM“与”到累加器 1 1ANL A,#data 立即数“与”到累加器 2 1ANL direct,A 累加器“与”到直接地址 2 1 ANL direct, #data 立即数“与”到直接地址 3 2 ORL A,Rn 寄存器“或”到累加器 1 2ORL A,direct 直接地址“或”到累加器 2 1 ORL A,@Ri 间接RAM“或”到累加器 1 1ORL A,#data 立即数“或”到累加器 2 1ORL direct,A 累加器“或”到直接地址 2 1 ORL direct, #data 立即数“或”到直接地址 3 1 XRL A,Rn 寄存器“异或”到累加器 1 2XRL A,direct 直接地址“异或”到累加器 2 1 XRL A,@Ri 间接RAM“异或”到累加器 1 1 XRL A,#data 立即数“异或”到累加器 2 1XRL direct,A 累加器“异或”到直接地址 2 1 XRL direct, #data 立即数“异或”到直接地址 31CLR A 累加器清零 1 2CPL A 累加器求反 1 1RL A 累加器循环左移 1 1RLC A 带进位累加器循环左移 1 1RR A 累加器循环右移 1 1RRC A 带进位累加器循环右移 1 1SWAP A 累加器高、低4 位交换 1 1(控制转移类指令)JMP @A+DPTR 相对DPTR 的无条件间接转移 1 2 JZ rel 累加器为0 则转移 2 2JNZ rel 累加器为1 则转移 2 2CJNE A,direct,rel 比较直接地址和累加器,不相等转移 3 2CJNE A,#data,rel 比较立即数和累加器,不相等转移 3 2CJNE Rn,#data,rel 比较寄存器和立即数,不相等转移 2 2CJNE @Ri,#data,rel 比较立即数和间接RAM,不相等转移 3 2DJNZ Rn,rel 寄存器减1,不为0 则转移 3 2 DJNZ direct,rel 直接地址减1,不为0 则转移 3 2 NOP 空操作,用于短暂延时 1 1ACALL add11 绝对调用子程序 2 2LCALL add16 长调用子程序 3 2RET 从子程序返回 1 2RETI 从中断服务子程序返回 1 2AJMP add11 无条件绝对转移 2 2LJMP add16 无条件长转移 3 2SJMP rel 无条件相对转移 2 2(布尔指令)CLR C 清进位位 1 1CLR bit 清直接寻址位 2 1SETB C 置位进位位 1 1SETB bit 置位直接寻址位 2 1CPL C 取反进位位 1 1CPL bit 取反直接寻址位 2 1ANL C,bit 直接寻址位“与”到进位位 2 2 ANL C,/bit 直接寻址位的反码“与”到进位位 2 2ORL C,bit 直接寻址位“或”到进位位 2 2 ORL C,/bit 直接寻址位的反码“或”到进位位 2 2MOV C,bit 直接寻址位传送到进位位 2 1 MOV bit, C 进位位位传送到直接寻址 2 2JC rel 如果进位位为1 则转移 2 2JNC rel 如果进位位为0 则转移 2 2JB bit,rel 如果直接寻址位为1 则转移 3 2 JNB bit,rel 如果直接寻址位为0 则转移 3 2 JBC bit,rel 直接寻址位为1 则转移并清除该位2 2(伪指令)ORG 指明程序的开始位置DB 定义数据表DW 定义16 位的地址表EQU 给一个表达式或一个字符串起名DATA 给一个8 位的内部RAM 起名XDATA 给一个8 位的外部RAM 起名BIT 给一个可位寻址的位单元起名END 指出源程序到此为止(指令中的符号标识)Rn 工作寄存器R0-R7Ri 工作寄存器R0 和R1@Ri 间接寻址的8 位RAM 单元地址(00H-FFH) #data8 8 位常数#data16 16 位常数addr16 16 位目标地址,能转移或调用到64KROM 的任何地方addr11 11 位目标地址,在下条指令的2K 范围内转移或调用Rel 8 位偏移量,用于SJMP 和所有条件转移指令,范围-128~+127Bit 片内RAM 中的可寻址位和SFR 的可寻址位Direct 直接地址,范围片内RAM 单元(00H-7FH)和80H-FFH$ 指本条指令的起始位置结束在讲指令系统前我们先来复习一下数制的概念。
第七讲数据传送类指令教学方法:讲授法教学目的:1、熟悉数据传送的三种方式及特点2、熟悉ROM数据传送(查表)3、熟练掌握RAM数据传送教学重点、难点:堆栈操作指令、查表指令主要教学内容(提纲):一、数据传送的三种方式二、ROM数据传送三、RAM数据传送复习:1、MCS-51系列指令格式?2、六种寻址方式分别是什么?讲授要点§3-2 数据传送类指令一、内部RAM数据传送类1、一般数据传送指令回忆前述操作数描述符:A,direct,Rn,@Ri,#data,DPTR等。
经排列组合可写出下列指令:MOV A,Rn ;(A)(Rn)以下类似。
MOV A,directMOV A,@RiMOV A,#dataMOV Rn,AMOV Rn,directMOV Rn,#dataMOV direct,AMOV direct,RnMOV direct,directMOV direct,@RiMOV direct,#dataMOV @Ri,AMOV @Ri, directMOV @Ri,#dataMOV DPTR,#data16 ;唯一的16位数据传送指令。
上述指令不影响任何标志位,但PSW的P位除外。
注意:MOV Rn,RnMOV @Ri, @RiMOV Rn, @RiMOV #data, A等指令是非法指令。
2、栈操作指令PUSH directPOP direct不影响任何标志位。
PUSH direct 指令执行中,机器自动进行两步操作:(1)(SP)(SP)+ 1(2)((SP))(direct)例1、设(SP)= 09H,(DPTR)= 0123H,分析:执行PUSH DPLPUSH DPH后,各单元中的内容。
POP direct 指令执行中,机器也自动进行两步操作:(1)(direct)((SP))(2)(SP)(SP)-1例2、设(SP)= 0BH,(0BH)= 01H,(0AH)= 23H执行POP DPHPOP DPL后,各单元中的内容。
3.2.1 数据传送类指令数据传送指令用于实现寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、立即数到寄存器或存储器之间的字节或字的传送。
这类指令的共同特点是不影响标志寄存器的内容(SAHF,POPF除外)。
堆栈操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。
1.通用数据传送指令通用数据传送指令包括传送指令MOV、堆栈操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交换指令XCHG和查表转换指令XLAT。
这类指令是唯一允许以段寄存器作为操作数的指令(XCHG除外)。
表3.4 数据传送类指令指令类型指令书写格式指令功能通用数据传送指令MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT 字节或字传送字压入堆栈字弹出堆栈字节或字交换字节翻译目标地址传送指令LEA 目标,源LDS 目标,源LES 目标,源装入有效地址装入DS寄存器装入ES寄存器标志位传送指令LAHFSAHFPUSHFPOPF 将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压入堆域从堆栈弹出FR内容I/O数据传送指令IN 累加器,端口OUT 端口,累加器从端口输入字节或字将字节或字输出到端口(1)MOV 传送指令指令格式:MOV OPD,OPS指令功能:将源操作数OPS传送到目的操作数OPD,即(OPD)→(OPS)。
源操作数OPS可以是8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的立即数。
(2)PUSH进栈(压入)指令指令格式:PUSH OPS指令功能:将源操作数OPS压入堆栈,即SP–2 → SP,OPS → (SPH,SP)。
源操作数0PS可以是16位通用寄存器、段寄存器或存储器中的数据字,以保证堆栈按“字”操作。
源操作数OPS不能是立即数。
由于堆栈是按“后进先出”方式工作,所以每次执行PUSH指令时,总是首先修改栈指针(S P)–2 → SP (即SP先减2),使之指向新栈顶,然后把源操作数压入堆栈中SP所指示的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。
由于堆栈总是按字操作,所以,SP总是指向字地址单元,堆栈段基址由SS确定。
堆栈最大容量为64K。
(3)POP出栈(弹出)指令指令格式:POP OPD指令功能:将堆栈中当前SP所指示的栈顶的一个字传送到指定的目的操作数OPD中,同时修改栈指针,即(SP+1,SP)→ OPD,(SP)+ 2 → SP,出栈操作是进栈操作的逆过程。
目的操作数OPD可以是16位通用寄存器、段寄存器或存储单元,但CS不能作目的操作数。
和进栈指令不同的是,出栈操作时是先将数据弹出送入目标地址,然后修改栈指针,即将S P减2送SP,这时SP向高地址端移动,指向新的栈顶。
(4)XCHG数据交换指令指令格式:XCHG OPD,OPS指令功能:把一个字或字节的源操作数OPS与目的操作数OPD互相交换位置。
即(OPD)→ OPS,(OPS)→ OPD。
源操作数OPS可为通用寄存器或存储器,目的操作数OPD只能为通用寄存器。
因此,交换指令可以在通用寄存器之间、通用寄存器与累加器之间、通用寄存器与存储器之间进行。
段寄存器不能作为操作数。
(5)XLAT查表转换指令(换码指令)指令格式:XLAT 转换表或XLAT指令功能:将[BX]为首址,[AL]为位移量的字节存储器单元中的数据→ AL,即[BX+AL] → AL。
查表转换指令XLAT可用来将一种代码转换成另一种代码,或者说可使累加器中的一个值变换为内存表格中的某一个值。
具体实现是这样的:使用XLAT指令之前必须先在内存(数据段)中建立一个表格,表格的内容就是所需要转换的代码,表格最多不超过256个字节,将表格的起始地址事先装入BX寄存器中,AL中存放所要查找的对象(表中某一项)到表首地址间的位移量。
执行XLAT指令时,就将BX 中的内容和AL中的内容相加作为有效地址,将表格中与该地址相对应的单元中的内容取出并传送到AL中。
也就是说,指令执行后所要查找的对象(即转换后的代码)就在AL中,BX中内容保持不变。
可见,只要改变AL的值即可从表中找到不同的代码。
例:利用XLAT指令将一位十六进制数转换为对应的ASCII码。
为实现这一转换,首先应在内存数据段建立一个表格,表中存放着十六进制数0,1,…,F 的ASCII码,并将表格的首地址置于BX中,AL中置入所要查找的十六进制数距表头的位移量,比如现在要查找表中第5项内容,则AL中应置入4。
实现上述操作的程序如下:DATA SEGMENTTAB DB ‘0 1 2 3 4 5 6 7 8 9 A B C D E F’DATA ENDMOV BX,OFFSET TAB ;变量TAB的有效地址FA → BX,即表示首址MOV AL,4 ;TAB表中第5项的位移量4 → ALXLAT TAB ;([BX+AL])=(TAB+4)=34H → AL上述过程如图3.5所示。
程序中DATA SEGMENT到DATA END之间的语句是十六进制数的ASCII码表。
2.地址传送指令8086/8088指令系统中有3条专门用于传送地址的指令:LEA、LDS和LES。
可用来传送操作数的段地址或偏移地址。
(1)LEA取有效地址指令指令格式:LEA OPD,OPS指令功能:按源操作数OPS提供的寻址方式计算偏移地址(即EA),并将该偏移地址传送到目的操作数OPD所指示的16位寄存器中。
注意:LEA指令中要求源操作数OPS所提供的必须是一个存储器单元地址,而目的操作数OPD必须是一个除段寄存器以外的16位寄存器。
另外,使用LBA指令时应注意它与MOV 指令的区别,MOV指令传送的是源操作数中的内容,而LEA指令传送的是源操作数的有效地址。
注意下面两条指令的区别:MOV AX,[SI] ;将SI所指示的存储单元中的内容送AXLEA AX,[SI] ;将SI所指的存储单元的EA送AX下列两条指令是等价的,都是将变量NUM的EA送SI中。
MOV SI,OFFSET NUM ;将变量NUM的EA送SI中,;OFFSET为数值返回运算符LEA SI,NUM ;与上条MOV指令等效,将NUM的EA送SI;这说明有时可用MOV指令来代替LEA指令。
(2)LDS送偏移地址及数据段首址指令指令格式:LDS OPD,OPS指令功能:(OPS)→ OPD,(OPS+2)→ DS该指令执行时是把从源操作数OPS所指示的连续4个字节(双字)存储器单元中的操作数送到目的寄存器OPD和DS中,其中低位地址的两个字节传送到OPD指示的寄存器中,高位地址的两个字节传送到段寄存器DS中。
可见,LDS指令要求:OPD一定要是一个16位通用寄存器,常用SI寄存器。
OPS所提供的一定要是一个存储器地址,且是一个地址指针,从指针所指示的地址单元开始,连续4个字节单元的内容分别送入OPD和DS中。
(3)LES传送偏移地址及附加数据段首址指令指令格式:LES OPD,OPS指令功能:(OPS)→ OPD,(OPS+2)→ ESLES指令功能与LDS类似,所不同的是将OPS所指示的4个连续单元中的后两个字节(高地址)单元中的内容送入附加数据段寄存器ES中而不是送入DS,前两个字节(低地址)单元中的内容送OPD所指示的16位寄存器中。
3.标志位传送指令标志位传送指令共有4条:LAHF(标志装入AH)、SAHF(AH的内容存入标志寄存器)、PUSHF(标志压入堆栈)和POPF(标志出栈)。
这些都是单字节指令,指令的操作数是隐含的,因此这些指令都是无操作数指令。
通过这些指令的执行,可以读出当前标志寄存器中的内容,也可以对标志寄存器设置新值。
(1)LAHF标志寄存器低字节送AH指令指令格式:LAHF指令功能:把标志寄存器FR中SF,ZF,AF,PF和CF(8080和8085所具有的标志)分别送到AH中第7,6,4,2和0位,AH中第5,3,1位内容未定义,可任意,标志寄存器本身内容不变。
(2)SAHF AH送标志寄存器低字节指令指令格式:SAHF指令功能:SAHF的功能与LAHF指令相反,是将AH中第7,6,4,2和0位状态传送至标志寄存器FR中的SF,ZF,AF,PF和CF位,取代这些标志位原内容,而OF,IF,TF,DF标志不受影响。
可见,通过该指令可以对标志位进行重新设置,所以该指令也叫设置标志指令。
(3)PUSHF标志进栈指令指令格式:PUSHF指令功能:把整个标志寄存器的内容压入堆栈,同时修改栈指针,即SP–2 → SP,该指令执行后不影响标志位。
(4)POPF标志出栈指令指令格式:POPF指令功能:POPF的功能正好与PUSHF相反,是将当前堆栈指针SP所指的一个字传送到标志寄存器FR中,同时修改栈指针即SP+2 → SP。
PUSHF和POPF这两条指令用于人为地保存和恢复标志寄存器,常用过程调用和中断服务程序的开头与结尾,用来保存主程序的状态标志。
这两条指令的另一个用途是用来改变跟踪单步标志TF,8086/8088指令系统中没有能直接改变TF的指令,若要改变TF,可先用PUSHF指令将标志寄存器压入堆栈,然后设法改变栈顶单元中D8位(TF位),然后再用POPF指令把堆栈中修改过的内容送回标志寄存器。
这样,只有TF位被改变,其它标志位不变。
4.输入/输出指令(累加器专用传送指令)输入/输出数据传送指令简称I/O指令,共两条,一条是输入指令IN,另一条是输出指令OUT。
I/O指令用来完成累加器AL/AX与I/O端口问的数据传送,指令中给出I/O端口的地址,当端口地址值≤255时,端口地址由指令中直接给出,当端口地址值≥256时用间接方式,先将端口地址位置于DX中,然后指令中用DX作间址方式表示。
因此,I/O指令有两种格式。
(1)IN输入指令指令格式:直接方式(长格式):IN AL,端口地址;字节(8位)传送IN AX,端口地址;字(16位)传送间接方式(短格式):IN AL,DX ;端口地址放在DX寄存器中IN AX,DX指令功能:将端口地址中的8位或16位数传送到AL或AX中,将端口中的16位数输入时,先将指定端口中的字节数送入AL中,再将端口地址+1,然后将该端口中的字节数送入A H中。
由上可知,IN指令有两种格式,当端口地址为00~FFH时用直接方式,端口地址值包含在指令中;当端口地址为0000~FFFFH时,用间接方式,即先将端口地址放在DX中,指令中用DX代替端口地址。
注意,这时指令的书写形式与寄存器寻址方式相似,但这里实际上是间址方式。
例:IN AL,02FH ;将02FH端口的一个字节数送入ALIN AX,060H ;将060H端口的内容送AL,将061H端口的内容送AHMOV DX,300H ;先将端口地址300H送人DX中IN AL,DX ;将300H端口的内容送入AL中(2)OUT输出指令指令格式:直接方式:OUT端口地址,AL ;字节(8位)输出OUT端口地址,AX ;字(16位)输出间接方式:OUT DX,AL ;DX中为端口地址OUT DX.AX指令功能:将累加器(AL/AX)中的内容输出传送到指定的I/O端口中。