本教案内容第3章8086CPU指令系统1.汇编语言指令2.8086指令分类3.数据与转移地址的寻址方式4.数据传送类指令5.算术运算类指令6.逻辑运算类指令7.移位类指令8.标志位操作指令9.转移指令10.循环控制指令11.子程序调用返回指令12.中断调用返回指令13.字符串操作指令14.I/O输入输出指令15.其它指令16.宏指令3.4数据传送类指令数据传送类指令可以完成数据在寄存器、存储单元之间的传递。这一类的指令有:MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF和POPF,其共同点有:①除指令SAHF、POPF之外,其它指令不影响PSW(微处理器状态字)中的各标志位;②当指令中有两个操作数时,第一个操作数为目的操作数,第二个为源操作数;③目的操作数的寻址方式一定不能为立即数和段寄存器CS。3.4数据传送类指令这些指令又可以分成七个子类:POPFPUSHFPOPPUSHXLATXCHGSAHFLAHFLESLDSLEAMOV,,,堆栈操作指令字节转换指令数据交换指令,标志传送指令,获取地址指针指令获取有效地址指令通用传送类指令传送类指令1.通用传送指令(MOV)3.4数据传送类指令格式:MOVDST,SRC;(DST)←(SRC)说明:将SRC(源操作数)中的一个字节或一个字传送到DST(目的操作数)所指定的位置。MOV指令可以在立即数、存储单元、寄存器和段寄存器之间传送数据,其传送路径如图3.3所示。立即数寄存器AXAXBXBXCXCXDXDXSISIDIDISPSPBPBP存储单元段寄存器DS,ES,SSCS①立即数→通用寄存器或存储单元例1:MOVAX,1234H;将1234H传送到AX中1234HAX????12343.4数据传送类指令①立即数→通用寄存器或存储单元例2:MOVvar1,1234H;将1234H传送到变量var1中1234H????DS:var134H12H3.4数据传送类指令②通用寄存器→存储单元例3:MOVvar1,DX;将DX的内容传送到变量var1中DX55AAH????DS:var1AAH55H3.4数据传送类指令③存储单元→通用寄存器例4:MOVDX,var2;将变量var2的内容传送到DX中DX1234H????DS:var234H12H3.4数据传送类指令④通用寄存器←→通用寄存器例5MOVAX,BX;将BX的内容传送到AX中AX????BX78AD78AD3.4数据传送类指令⑤通用寄存器←→段寄存器例6MOVDS,AXMOVBX,ESDS????AX12341234BX????ESAA55AA553.4数据传送类指令⑤通用寄存器←→段寄存器例7MOVDX,CSCS1234DX????12343.4数据传送类指令⑥段寄存器←→存储单元例8MOVDS,var1DS????12343412DS:var13.4数据传送类指令????DS:var2⑥段寄存器←→存储单元例9MOVvar2,ESES55AAAAH55H3.4数据传送类指令????DS:var2⑥段寄存器←→存储单元例10MOVvar2,CSCS55AAAAH55H3.4数据传送类指令3.4数据传送类指令从图3.3中,还应该特别注意MOV指令不能直达的路径:立即数×→段寄存器存储单元×→存储单元段寄存器×→段寄存器3.4数据传送类指令如果要完成数据在这些路径上的传送,则应该分两步操作。①立即数→段寄存器一般可以通过立即数→通用寄存器→段寄存器来完成,例如:MOVAX,3A01HMOVDS,AX;(DS)←3A01H3.4数据传送类指令②存储单元→存储单元一般可以通过存储单元→通用寄存器→存储单元来完成,例如:MOVAX,VAR1MOV[DI+10],AX;((DI)+10)←VAR13.4数据传送类指令③段寄存器→段寄存器一般可以通过段寄存器→通用寄存器→段寄存器来完成,例如:MOVAX,CSMOVDS,AX;(DS)←(CS)应该注意:CS不能作为目的寄存器。例如,下面指令书写是正确的。MOVAX,BX;将BX中的一个字传送到AX中MOVAL,DL;将DL中的一个字节传送到AL中MOVAX,02;将立即数02传送到;AX中MOVSI,[BX];(SI)((BX))3.4数据传送类指令MOVAL,4[DI];将(DI)+4作为偏移地址,;将该单元内容送入ALMOVAX,[BX+2];将寄存器BX中的内容加;2后的值作为偏移地址,;将该单元中的一个字节;送入AL中,下一单元中;的一个字节送AH中3.4数据传送类指令MOV[BX][DI],DX;((BX)+(DI))(DL);((BX)+(DI)+1)(DH)3.4数据传送类指令当程序中采用伪指令定义了一组变量后,那么,传送指令也可以有下面的形式:3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVAX,DATA1;AX(DATA1)∴指令执行后,(AX)=1234H34H12H78H56HDATA1ALAH3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVBX,1122HMOVDATA3,BX;(DATA3)(BX)∴指令执行后,(DATA3)=1122H3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVDI,2MOVAL,DATA2[DI];AL(DS:OFFSETDATA2+(DI))∴指令执行后,(AL)=40H3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVSI,2MOVDX,0AABBHMOVDATA3[SI],DX;(DS:OFFSETDATA3+(SI))(DX)∴指令执行后,(DS:OFFSETDATA3+(SI))=0AABBHDATA3DLDH0BBH0AAH+1+23.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVBP,2MOVAL,DATA2[BP];AL(DS:OFFSETDATA2+(BP))∴指令执行后,(AL)=40H3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVCX,LENGTHDATA3;CXLENGTHDATA3∴指令执行后,(CX)=10(0AH)3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVBX,SIZEDATA3;(BX)SIZEDATA3∴指令执行后,(BX)=20(14H)3.4数据传送类指令设在数据段(DS段)有下面的变量定义:DATA1DW1234H,5678HDATA2DB20H,30H,40HDATA3DW10DUP(?)则传送指令可以有:MOVSI,OFFSETDATA2;(SI)OFFSETDATA2∴指令执行后,(SI)=0004H3.4数据传送类指令对于双操作数指令,两个操作数的类型必须匹配:1.两者都指定了类型,则必须一致,否则指令出错(类型不一致);2.两者之一指定了类型,一般指令无错;3.两者都无类型,则指令出错(类型不定)。3.4数据传送类指令对于操作数的类型,还应该注意:1.立即数是无类型的;2.不含变量名的直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址的操作数也是无类型的;3.利用PTR操作符可指定或暂时改变存储单元的类型。3.4数据传送类指令应该搞清楚什么样的操作数为立即数。从形式上看,立即数有:由常数等组成的表达式所有由属性操作符得到的标号或变量的属性。3.4数据传送类指令例如,下面指令书写是错误的。(DATA1为字变量)MOV10H,ALㄨDST不能为立即数寻址MOVAL,CXㄨ类型不一致MOV[BX][SI],78Hㄨ类型不明确3.4数据传送类指令MOVDATA1,AHㄨ类型不一致MOV[DI]+02H,DATA1ㄨ两单元之间不能直接传送数据MOVCS,AXㄨCS不能做DSTMOVDS,0100Hㄨ当DS作DST时,SRC不能为立即数3.4数据传送类指令2.取有效地址指令(LEA)LoadEffectiveAddress格式:LEAREG,MEM功能:指令的功能是将源操作数MEM(存储单元)的有效地址(偏移地址)传送到寄存器REG。这是一条特殊指令,它传送的不是操作数本身,而是操作数的有效地址。注:DSTREG为通用REG,一般用BX、BP、SI、DI。3.4数据传送类指令例如:LEADI,VAR1;(DI)←VAR1的偏移地址等效于:MOVDI,OFFSETVAR1LEABX,VAR1+15;(BX)←VAR1的偏移地址+15等效于:MOVBX,OFFSETVAR1+253.4数据传送类指令3.取地址指针指令(LDS,LES)LoadData/ExtraSegmentRegister格式:LDSREG16,MEM;(DS)←(MEM+2),(REG16)←(MEM)LESREG16,MEM;(ES)←(MEM+2),(REG16)←(MEM)3.4数据传送类指令功能:取地址指针指令LDS可以将双字变量MEM内容中的高16位送入DS,低16位送入指定的REG16中;而取地址指针指令LES可以将双字变量MEM内容中的高16位送入ES,低16位送入指定的REG16中。3.4数据传送类指令例如定义变量:TABLEDB10H,20H,……POINT1DD02001000HPOINT2DDTABLE则可以有指令LDSDI,POINT1;(DS)←0200H,(DI)←1000HLESSI,POINT2;(ES)←TABLE的段地址,;(SI)←TABLE的偏移地址……3.4数据传送类指令4.标志传送指令(LAHF,SAHF)LoadAHregisterfromflagsStoreAHregisterinflags格式:LAHF;(AH)←PSW寄存器的低8位SAHF;PSW寄存器的低8位←(AH)3.4数据传送类指令说明:指令LAHF(LoadAHregisterfromflags)可以将PSW寄存器中的低8位传送到寄存器AH中,而指令SAHF(StoreAHregisterinflags)可以将AH中的内容传送到PSW寄存器中的低8位中。源操作数和目的操作数的寻址方式均为隐含寻址方式。3.4数据传送类指令5.数据交换指令(XCHG)格式:XCHGDST,SRC;DST←→SRC功能:该指令是完成寄存器与寄存器或寄存器与存储单元之间内容交换的。该指令要求两个操作数之一必须是寄存器,允许两个操作数都是寄存器,但不允许是段寄存器。注:段REG和立即数不能参加交换。3.4数据传送类指令例1合法指令有:XCHGAX,BX;(AX)←→(BX)XCHGCX,[DI];(CX)←→((DI))XCHGDX,VAR1;(DX)←→(VAR1)3.4数据传送类指令例2.下面指令书写格式是错误的。XCHGAX,1234Hㄨ立即数不能参加交换XCHGBX,ESㄨES段寄存不能参加交换XCHGAL,CXㄨ类型不一致XCHGDAT1,DAT2ㄨ两存储器单元不能直接交换3.4