第1页共21页第三章8086指令系统指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解INTEL公司生产的8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。通过本章的学习,读者应该掌握以下内容:主要内容:1、8086寻址方式2、8086指令系统重点内容:1、8086寻址方式2、数据传送指令、加法指令、逻辑运算及控制转移类指令•8086指令系统的特点:•指令系统:指令的集合。•不同计算机指令系统不一样。•兼容性:向上兼容,如:8位机8080、8085•灵活的指令格式:不同功能指令长度1~6字节•寻址能力和数据存取能力强•具有处理多种类型数据的能力:8位、16位正数、负数•便于构成多处理机系统3、18086/8088的寻址方式本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。汇编指令:操作码操作数操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例:MOVAX,CX;将CX的内容送入AX中。•有效地址EA(EffectiveAddress)•寻址方式是指令系统基础,说明指令中操作数所在位置。操作数所在存储器单元20位地址由段基址和偏移地址之和构成,而此偏移地址也叫有效地址EA。如图3.1所示。1、立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。例:MOVAL,5;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOVAX,1234H;源操作数为立即寻址指令执行后,AX=1234H,16位数据1234H存入AX寄存器。2、寄存器寻址方式寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成两8位使用。例:MOVAX,BX;(AX)(BX)3、直接寻址方式在直接寻址方式中,操作数在存储器中,指令中给出操作数所在单元的有效地址EA。它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址或ES:偏移地址。例1:MOVAX,ES:[2000H];将ES:2000H单元内容送入AX。例2:MOVAL,[2000H]若段基址DS=4000H,则段起始物理地址为4000H左移4位,即40000H,此指令将数据段中物第2页共21页理地址为42000H单元的内容56H传至AL寄存器。如右图所示。注意:(1)指令中EA无具体说明,则默认是数据段(2)操作数可以是CS、SS、ES,但必须说明(如例1)(3)适用于单个变量:一个字或一个字节4、寄存器间接寻址寄存器间接寻址方式的操作数形式为:[reg]操作数的EA包含在由指令中的寄存器给出。这些寄存器是BX、BP、SI、DI之一。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。例:MOVAX,[BX];将由BX决定的存储单元(EA=0001H)的内容送到AX寄存器。操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。物理地址计算方法:物理地址=(DS)*16(10H)+(BX)或(SI)或(DI)物理地址=(SS)*16(10H)+(BP)例:已知:(DS)=2100H,(DI)=2000H指令:MOVAX,[DI];(AX)((DI))物理地址=(DS)*16+(DI)=2100H*16+2000H=21000H+2000H=23000H指令结果:将23000H单元内容送AL中,将23001H单元内容送AH中。5、基址/变址寻址操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,并由一个可正可负的8位/16位偏移量,实现如下图。如:MOVAX,[BX+06H]物理地址=(DS)*16+(BX)+DISP8物理地址=(SS)*16+(BP)+DISP16(SI)、(DI)、DISP16类同。例:如果(DS)=3000H,(SI)=2000H,COUNT=3000H,则执行指令MOVAX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。有效地址=2000H+3000H=5000H物理地址=(DS)*16+5000H=30000H+5000H=35000H6、基址+变址寻址方式:操作数的有效地址由基址寄存器BX/BP和变址寄存器SI/DI及一个可正可负的8位/16位偏移量组成,实现如右图。如:MOVAL,[BX][DI+30H]物理地址=(DS)*16+(BX)+(SI)或(DI)+位移量物理地址=(SS)*16+(BP)+(SI)或(DI)+位移量例:MOVAX,[BX+DI]或MOVAX,[BX][DI]DS:(BX)+(DI)字存储单元内容送AX。例:MOVAX,[BP+SI]或MOVAX,[BP][SI]SS:(BP)+(SI)字存储单元内容送AX。例:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,则执行指令MOVAL,[BX][DI]则:有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH第3页共21页物理地址:(DS)*16+有效地址=21000H+11FDH=221FDH执行结果:将221FDH单元内容送入寄存器AL中。7、串寻址:只用在字符串操作中。常用SI指向源字符串的第一个字节或字,DI指向目标字符串的第一个字节或字,且传送的字符串必须在ES段中。8、输入/输出端口寻址:指对I/O口读/写,可用直接和间接两种寻址方式。•例1:设BX=0158H,DI=10A5H,偏移量=1B57H,•DS=2100H,并假设DS为当前段寄存器。•则:(1)直接寻址:MOVAX,[1B57H]•EA=1B57H;物理地址=21000H+1B57H=22B57H•(2)寄存器间接寻址:MOVAX,[BX]•EA=0158H;物理地址=21000H+0158H=21158H•(3)基址寻址:MOVAX,[BX+1B57H]•EA=BX+1B57H=0158H+1B57H=1CAFH;•物理地址=21000H+1CAFH=22CAFH•(4)变址寻址:MOVAX,[DI+1B57H]•EA=DI+1B57H=10A5H+1B57H=2BFCH;•物理地址=21000H+2BFCH=23BFCH•(5)基址加变址寻址:MOVAX,[BX][DI+1B57H]•EA=0158H+10A5H+1B57H=2D54H;•物理地址=21000H+2D54H=23D54H3.2段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。例如:MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS段地址的基本约定和允许超越的情况如表所示:存储器存取方式约定段允许超越段偏移地址取指令堆栈操作源串目的串BP作基址通用数据读写CSSSDSESSSDS无无CS,ES,SS无CS,DS,ESCS,ES,SSIPSPSIDI有效地址EA有效地址EA3.3标志位在标志寄存器FLAGS中有若干标志位,这些标志用来表示CPU当前的操作方式和状态信息。与普通应用程序有关的主要是FLAGS中的9个标志6个状态标志(CF、OF、SF、ZF、AF、PF)3个控制信息标志(DF、IF、TF)第4页共21页3.3.1深入认识CF和OF1、深入认识CF和OFCF表示无符号溢出,即运算结果超出了无符号数的表示范围。OF表示带符号溢出,即运算结果超出了带符号数的表示范围。2、CF和OF判断方法(1)加法①CF的判断方法从十进制角度来看,若无符号加的结果大于2n-1(n为位数),则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有进位,则CF=1,否则CF=0。②OF的判断方法从十进制角度来看,若带符号加的结果不在范围-2n-1~2n-1-1(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则OF=1,否则OF=0。例:8位数加法,判断CF和OF(2)减法①CF的判断方法从十进制角度来看,若无符号减数大于被减数,则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有借位,则CF=1,否则CF=0。②OF的判断方法从十进制角度来看,若带符号减的结果不在范围-2n-1~2n-1-1(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则OF=1,否则OF=0。3.4指令系统8086/8088的指令系统可以分为6组:(1)数据传送指令;(2)算术运算指令;(3)逻辑指令与移位指令;(4)串操作指令;(5)控制转移指令;(6)处理机控制指令;3、4、1数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中。1.MOV(Move):传送指令MOV指令的格式为:MOVdest,src;dest←src功能:将源操作数src复制到目的操作数dest中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。对标志位的影响:无语法格式:MOVreg/mem/seg,reg/mem/seg/imm说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。MOVseg,seg;错误如:MOVDS,ESMOVmem,mem;错误如:MOV[1000H],[BX]第5页共21页(2)立即数不能传送到段寄存器中。MOVseg,imm;错误如:MOVDS,2003H应先送入AX中,再由AX送入段寄存器中。如:MOVAX,2003HMOVDS,AX(3)目的操作数不允许使用CS段寄存器。(4)dest与src必须类型匹配,即同时是字节或字类型。如:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。例:错误的MOV指令如下所示:MOVAX,BL;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOV[BX],[SI];不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数改正后:(功能不变)MOVAX,BXMOVAX,1000HMOVDS,AXMOVAX,[SI]MOV[BX],AXMOVAX,CSMOVES,AX2.XCHG(Exchange):交换指令XCHG指令的格式为:XCHGoprd1,oprd2;交换oprd1与oprd2的内容语法格式为:XCHGreg/mem,reg/mem例:XCHGBX,[BP+SI]如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=5154H,OPR2的物理地址=2F000H+0200H+0046H=2F246H则指令执行后:(BX)=5154H(2F246H)=6F30H。3、堆栈操作指令•堆栈概念------存储器的一段区域,按“先进后出”的原则进行存出操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。•作用:保护断点、保护现场。•即:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。•指令格式:进栈PUSHSRC;(先(SP)-2,后保护数据)•操作:先(SP)(SP)-2,再((SP)+1,(SP))(SRC)•出栈POPDST;(先出数据,后(SP)+2)•操作:先(DS