第3章8086/8088指令系统l熟悉指令构成,了解指令执行时间。l掌握各种寻址方式。l熟悉指令系统,要求结合上机实践熟练掌握常用指令。l结合指令举例逐步熟悉和掌握汇编语言程序的格式,以及典型程序段。本章主要教学内容第3章8086/8088指令系统3.28086/8088寻址方式3.3指令的执行时间3.48086/8088指令系统3.18086/8088指令格式3.18086/8088指令格式机器指令:指挥计算机完成某种操作的命令。从计算机组成的层次结构来说,计算机指令有机器指令、伪指令和宏指令之分。指令格式如下:操作符目的操作数,源操作数3.28086/8088寻址方式3.2.1固定寻址(隐含操作数)如:popax被出栈的对象隐含在sp所指示的栈顶优点:无须计算有效地址EA,执行速度较快3.2.2立即寻址特点:操作数包含在指令中(在CPU的指令缓冲器中)操作数是指令的组成部分,可以是8位或16位,取出指令就立即获得操作数——立即数B005存储器指令AL05例:MOVAL,5执行指令后:(AL)=05H指令45AXOP45存储器30低地址高地址30例:MOVAX,3045H执行指令后:(AX)=3045H练习:p25-3.1,3.23.2.3寄存器寻址特点:操作数存在寄存器中例:MOVAX,BX执行指令前:(AX)=3045H(BX)=4000H执行指令后:(AX)=4000H(BX)=4000H用途:用寄存器提供操作数时存取速度快练习:p25-3.33.2.4存储器寻址(数据在内存中)(1)直接寻址方式(DirectAddressing)特点:操作数的偏移地址包含在指令中格式:(1)[常量](2)变量Q:存储器采用分段结构,在这种方式下如何确定段地址和偏移地址注意:该方式下段地址默认为在数据段寄存器DS中例:设(DS)=3000HMOVAX,[2000H]要访问的存储单元物理地址为:30000H+2000H=32000H设:(32000H)=3050H执行指令后:(AX)=3050H2000H5030…………存储器代码段op0020数据段30000H32000HAX3050用途:用于存取单个变量中的操作数如果2000H单元在附加段,指令为:MOVAX,ES:[2000H]段跨越前缀:段寄存器名:——改变默认使用的段寄存器练习:p26-3.4,3.5(2)寄存器间接寻址方式(RegisterIndirectAddressing)特点:(寄存器)=操作数的EA计算操作数物理地址的公式:1)操作数物理地址=(DS)16+2)操作数物理地址=(SS)16+(BP)格式:[BX,BP,SI或DI](BX)(SI)(DI)用途:可用于处理数组例:设(DS)=2000H(BX)=1000H指令为:MOVAX,[BX]20000H+1000H=21000H要访问的存储单元物理地址为:设:(21000H)=50A0H执行指令后:(AX)=50A0H1000HAXA050………存储器数据段20000H21000HXXXX21002H50A0数组起始地址练习:p27-3.6,3.7(3)基址寻址方式(BasedAddressing)变址寻址方式(IndexedAddressing)特点:(变址或基址寄存器)+指令中的位移量=操作数的EA计算操作数物理地址的公式:1)操作数物理地址=(DS)16+2)操作数物理地址=(SS)16+(BP)+格式:(1)偏移量[BX或BP]偏移量[SI或DI](2)[BX或BP][偏移量][SI或DI][偏移量](3)[BX或BP+偏移量][SI或DI+偏移量]+(SI)(DI)(BX)8位位移量16位位移量8位位移量16位位移量例:设(DS)=3000HARRAY=4000H(SI)=2000H指令为:MOVAX,ARRAY[SI]30000H+4000H+2000H=36000H要访问的存储单元物理地址为:设:(36000H)=1234H执行指令后:(AX)=1234HAX12343412…………存储器代码段op0040数据段36000Hop…数组起始地址4000H30000H2000H指令用途:可用于处理数组练习:p28-3.8,3.9(4)相对基址变址寻址方式(RelativeBasedIndexAddressing)特点:(基址、变址寄存器)+指令中的偏移量=操作数的EA格式:偏移量[BX或BP+SI或DI]其他形式与之前的表达类似计算操作数物理地址的公式:1)操作数物理地址=(DS)16+2)操作数物理地址=(SS)16+(BP)+(BX)+(SI)(DI)(SI)(DI)8位位移量16位位移量+8位位移量16位位移量+注意:当指令中的偏移量为0时,则可以缺省,此时的寻址方式也称为基址变址寻址方式例:设(SS)=3000H(BP)=2000HARRAY=0250H(SI)=1000HMOVAX,ARRAY[BP][SI]30000H+2000H+0250+1000H=33250H要访问的存储单元物理地址为:栈顶数组首址2000HAX12341000H30000H3412…………存储器代码段op5002堆栈段33250Hop……0250H指令用途:便于访问堆栈中的数组例:设(DS)=2100H(BX)=0158H(DI)=1000H指令为:MOVAX,[BX+DI]要访问的存储单元物理地址为:21000H+0158H+1000H=22158H设:(22158H)=1234H执行指令后:(AX)=1234H用途:可用于处理数组练习:p29-3.100158HAX12343412………存储器数据段21000H22158H1000H数组起始地址本节小结:(1):在8086CPU中,只有BX,BP,SI,DI可以用在[…]中进行内存单元的寻址(2):在[…]中,这四个可以单独出现,或只能以四种组合出现即:BX+SI,BX+DI,BP+SI,BP+DI(3):若在[…]中使用BP,且没有显性地给出段寄存器,则段地址默认为SS3.2.5练习:1:指出下列指令源操作数的寻址方式(1)MOVSI,10(2)MOVSI,[DI+2](3)MOVSI,[DI](4)MOVSI,[10](5)MOVSI,BX(6)MOVSI,5[BX+DI](7)MOVSI,[BP+DI]立即数寄存器相对寻址寄存器间接寻址存储器直接寻址寄存器寻址相对基址变址基址变址2:指出下列指令中存储器操作数的物理地址的计算表达式(1)MOVAL,[SI](2)MOVAX,[BP+6](3)MOV5[BX+DI],AX(4)INCBYTEPTR[BX+SI](5)ADDAL,ES:[BX](6)SUBAX,ALFA[SI]PA=DS*16+(SI)PA=SS*16+(BP)+6PA=DS*16+(BX)+(DI)+5PA=DS*16+(BX)+(SI)PA=ES*16+(BX)PA=DS*16+(SI)+ALFA3:指出下列寻址方式中的错误(1)MOVAX,[BX][BP](2)MOV3,[BX](3)MOV[BX],[SI](4)MOVCS,[BX][SI](5)MOVAX,[DX]4:设(DS)=2000H,(ES)=3000H,(SS)=4000H,(BX)=1000H,(BP)=1000H,(SI)=0002H,(DI)=0002H,(21000H)=1234H,(21002H)=5678H,(31000H)=9ABCH,(31002H)=0DEF0H,(41000H)=3456H,(41002H)=789AH,计算如下指令中源操作数的物理地址和执行后AX的内容:(1)MOVAX,ES:[1000H]PA=_____(AX)=_____(2)MOVAX,[BX]PA=_____(AX)=_______(3)MOVAX,[BP+DI]PA=_____(AX)=_______(4)MOVAX,[BX][SI]PA=_____(AX)=_______31000H9ABCH21000H1234H41002H789AH21002H5678H3.3指令的执行时间了解寻址方式对指令执行时间的影响3.48086/8088指令系统3.4.1数据传送指令①通用传送指令:MOV,PUSH,POP,XCHG②累加器专用传送指令:XLAT,IN,OUT③地址传送指令:LEA,LDS,LES④标志传送指令:LAHF,SAHF,PUSHF,POPF√1.通用传送指令1)MOV目的操作数,源操作数例:判断下列指令是否合法:MOVDS,AXMOVCS,AXMOVCH,4050HMOVDL,5BHMOVDX,5BHMOVDX,ALMOVVA1,VA2MOV45,DL不允许两个操作数都是存储器单元目的操作数不允许是CS段寄存器目的操作数不允许是立即数数据类型不匹配数据类型不匹配注意事项:MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器;MOV指令中绝对不允许在两个存储单元之间直接传送数据;MOV指令中绝对不允许在两个段寄存器之间直接传送数据;MOV指令不会影响标志位练习:p33-3.12,3.13p34-3.142)PUSH源操作数如:Pushax指令执行情况如下(1)sp=sp-2,ss:sp指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;(2)将ax中的内容送入ss:sp指向的内存单元处,ss:sp此时指向新栈顶Q:如果将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时,ss=1000H,sp=?3)POP目的操作数如:Popax指令执行情况如下(1)将ss:sp指向的内存单元处的数据送入ax中;(2)sp=sp+2,ss:sp指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶注意事项:堆栈操作都是字操作,不允许对字节操作,如pushah是不正确的;CS寄存器可以入栈,但不能随意弹出一个数据到CS例:若将10000H~1000FH这段内存当作栈来使用,写出下列程序执行过程中栈的变化情况Movax,0123HPushaxMovbx,2266HPushbxMovcx,1122HPushcxPopaxPopbxPopcx例:考虑栈满的情况8086CPU不保证我们对栈的操作不会越界,因此在编程时要自己操心栈顶超界的问题练习一:将10000H~1000FH这段空间当作栈,初始状态栈是空的,将ax,bx,ds中的数据入栈练习二:(1)将10000H~1000FH这段空间当作栈,初始状态栈是空的;(2)设置AX=001AH,BX=001BH;(3)将AX,BX中的数据入栈;(4)然后将AX,BX清零;(5)从栈中恢复AX,BX原来的内容作业:4)XCHG目的操作数,源操作数目的:交换两个操作数与MOV指令的区别:不允许使用立即数和段寄存器作为操作数;该指令改变源操作数的内容.例:XCHGBX,[BP+SI]如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4l54H源操作数的物理地址=2F000十0200十0046=2F246则指令执行后:(BX)=4154H(2F246H)=6F30H2.累加器专用传送指令目的:(AL)〈一((BX)十(AL))1)XLAT例:如(BX)=0040H,(AL)=0FH,(DS)=F000H所建立的表格如下图所示。注意:由于AL为8位二进制位,所以表格的最大长度不能超过256。指令XLAT指令执行后:(AL)=2CH(这组指令只限于使用累加器AX和AL传送信息)2)IN累加器,端口地址OUT端口地址,累加器格式:对于前256个端口,可以在指令中直接指定,这就是长格式的端口(PORT)。当端口号大于等于256时,则必须先将端口号置于DX寄存器中,然后再利用IN或OUT进行信息的传递。例INAX,28HMOVDATA_WORD,AX这两条指令把端口28的内容经过AX传送到存储单元DATA_WOR