数据传送指令实现CPU和存储器、CPU与外设之间的数据传送。主要包括:一般数据传送指令(MOV、XCHG、XLAT)、堆栈操作指令(PUSH、POP)、标志寄存器传送指令(PUSHF、POPF、LAHF、SAHF)、地址传送指令(LEA、LDS、LES)和输入/输出指令(IN、OUT)。在这些指令中,除了SAHF、POPF两指令外,其他指令均不影响标志位。
1.一般数据传送指令
(1)传送指令
指令格式:MOV OPD,OPS
功能:将源操作数传送至目的地址中,即(OPS)→OPD。
MOV指令可实现的数据传送关系如图3-8所示。
图3-8 数据传送关系
具体地说,MOV指令能实现下列传送功能。
①CPU内部寄存器之间的传送。例如:
③寄存器与存储器之间的数据传送。例如:
MOV指令的操作需要遵循以下规则:
①源操作数和目的操作数应有相同的类型(类型匹配),即必须同时为字节类型或同时为字类型。
②源操作数和目的操作数不能同时为存储器操作数,如果一个操作数在数据存储单元中,则另一个操作数要么是立即操作数(不能作目的操作数),要么是寄存器操作数。如指令MOV[BX],[SI]是非法指令。
③立即数不能直接传送段寄存器。
④目的操作数一定不能是立即操作数。
⑤代码段寄存器CS不能由程序赋值,即不能作为目的操作数。
⑥不允许在两个段寄存器之间直接传送数据。
⑦寄存器IP不能作为操作数。
以上规则同样适用于其他类型的两操作数指令。
(2)数据交换指令
指令格式:XCHG OPD,OPS
功能:(OPD)→OPS,(OPS)→OPD,即将源地址与目的地址中的内容互换。
注意:OPD和OPS都不能是立即数。
(3)查表转换指令
指令格式:XLAT OPS或XLAT
功能:([BX+AL])→AL,将(BX)为首址、(AL)为位移量的字节存储单元的数据→AL。
例3-10
该例通过查表方式获得16个数字的ASCII码。通过该例可进一步领会XLAT的功能及使用方法:以TAB为首址的字节存储区即为一字节转换表,内容可由用户设定,最多可为256项。要使用XLAT指令查找表中第五项的内容,首先必须将表首址送BX,待查找项在TAB中的位移量4一定要放入AL中,执行XLAT指令时,CPU根据(BX)找到表首址,再根据(AL)查找到所需的项,并将该项中的内容送AL。由于这条指令的全部操作数都是隐含的,因此可不带操作数或仅带表头地址。
从上例可见,XLAT指令可以很方便地将一种代码转换成另一种代码。该指令另一用途是对文本数据进行编码和译码,从而可实现简单的加密和解密。
2.堆栈操作指令
在8086/8088系统中,堆栈是一段以“后进先出”方式工作的连续的RAM区域,栈底一端地址较大,栈顶一端地址较小。堆栈操作必须在堆栈段中进行,其段地址存放于堆栈段寄存器SS中,堆栈指针寄存器SP的内容任何时候都指向当前的栈顶,SP的初值为堆栈的深度。进出堆栈的数据均以字为单位。堆栈操作指令有两条,一条指令的功能是把CPU内部寄存器(或字存储单元)中的信息压入堆栈(PUSH指令),另一条指令的功能是从堆栈中弹出信息送往CPU寄存器(或字存储单元)(POP指令)。注意两条指令对SP寄存器的作用。
(1)PUSH进栈指令
指令格式:PUSH OPS
功能:(SP)←(SP)-2;(SP+1,SP)←(OPS)。即压栈时堆栈指针SP减2获得当前的栈顶,将字数据压入当前的栈顶存储单元中。
(2)POP出栈指令
指令格式:POP OPD
功能:(OPD)←(SP+1,SP);(SP)←(SP)+2。即出栈时将当前的栈顶存储单元的内容取出送目的操作数OPD,并将堆栈指针SP加2获得新的当前的栈顶。
堆栈的存取必须是以字为单位(8086/8088 CPU不允许字节为单位的堆栈存取),所以PUSH和POP指令只能做字操作,它们可以是除立即数以外的其他寻址方式。
例3-11 设(AX)=01FFH,说明指令PUSH AX和POP AX的执行情况。
指令执行情况分别如图3-9、图3-10所示。
图3-9 PUSH AX指令的执行情况
图3-10 POP BX指令的执行情况
3.标志寄存器传送指令
(1)LAHF标志送AH指令(www.xing528.com)
指令格式:LAHF
功能:AH←(PSW的低字节),即标志寄存器低8位送AH。
(2)SAHF AH送标志寄存器指令
指令格式:SAHF
功能:(PSW的低字节)←AH,即AH的内容送标志寄存器低8位。
(3)PUSHF标志进栈指令
指令格式:PUSHF
功能:SP←(SP)-2,(SP+1,SP)←PSW;即标志寄存器内容送进堆栈。
(4)POPF标志出栈指令
指令格式:POPF
功能:PSW←(SP+1,SP),SP←(SP)+2;即将栈顶指示的单元内容送标志寄存器。
4.地址传送指令
(1)LEA传送偏移地址指令
指令格式:LEA OPD,OPS
功能:按OPS提供的寻址方式计算偏移地址,并将其送入OPD中。
说明:OPD必须是一个16位的通用寄存器;OPS所提供的一定是一个存储器地址。 例如:
(2)LDS传送偏移地址及数据段首址指令
指令格式:LDS OPD,OPS
功能:将OPS中所含的一个32位地址指针的高地址部分(段地址)送到数据段寄存器DS,低地址部分(偏移地址)送到指令中给出的通用寄存器。即(OPS)→OPD,(OPS+2)→DS。
说明:OPD一定要是一个16位的通用寄存器;OPS所提供的一定是一个存储器地址,且类型为双字(DD)型。
(3)LES传送偏移地址及附加数据段首址指令
指令格式:LES OPD,OPS
功能:该指令将段地址送到附加段寄存器ES,其他用法同指令LDS。即(OPS)→OPD,(OPS+2)→ES。
例3-12阅读下列程序段,仔细领会LEA、LDS指令在程序中的作用。
5.输入/输出指令
输入/输出指令有两条:IN(输入指令)和OUT(输出指令),主要用于CUP与外设之间信息的交换。这组指令只限于使用累加器AX或AL传送信息。
(1)IN输入指令
长格式:INAL,PORT ;字节操作
INAX,PORT ;字操作
其中PORT为端口地址,范围为00H~FFH。
功能:(AL)←(PORT),或(AX)←(PORT+1,PORT)。即将端口地址为PORT的端口的内容送AL或AX。
短格式:INAL,DX ;字节操作
INAX,DX ;字操作
其中寄存器DX的内容为端口地址,范围为0000H~FFFFH。
功能:(AL)←(DX),或(AX)←(DX+1,DX)。即将DX的内容为端口地址的端口的内容送AL或AX。
说明:长格式又称直接端口寻址,适用于端口地址为8位的情况;短格式又称间接端口寻址,适用于端口地址为16位的情况,间接寻址的寄存器必须使用DX。
(2)OUT输出指令
长格式:OUT PORT,AL ;字节操作
OUT PORT,AX ;字操作
其中PORT为端口地址,范围为00H~FFH。
功能:(PORT)←(AL),(PORT+1,PORT)←(AX)。即将AL或AX的内容送端口地址为PORT的端口中。
短格式:OUT DX,AL ;字节操作
OUT DX,AX ;字操作
其中寄存器DX的内容为端口地址,范围为0000H~FFFFH。
功能:(DX)←(AL),或(DX+1,DX)←(AX)。即将AL或AX的内容送以DX的内容为端口地址的端口中。
例3-13阅读下列程序段,指出其完成的功能。
解:功能为读取端口20H的内容至AL,送BL保存,并将其送21H端口。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。