第3章8086/8088指令系统与寻址方式-1-第3章8086/8088指令系统与寻址方式一、内容简介:1寻址方式:基本的寻址方式及有效地址的计算2指令格式3指令系统数据传送指令算术运算指令位操作指令串操作指令控制转移指令处理器控制指令二、教学目标:熟练掌握8086/8088微处理器的指令系统。三、重点内容:8种基本寻址方式;各种常用指令。四、教学时数:83.1概述3.1.1指令:计算机能够识别和执行的指挥计算机进行操作的命令两种表示方式:机器码和助记符指令的一般格式:操作码操作数……操作数操作码:指计算机所要执行的操作,是一种助记符。操作数:指令操作对象;目标操作数,源操作数。指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。指令系统:微处理器能执行的各种指令的集合。指令举例:ADDCL,BH;CL←CL+BH3.1.2操作数(各种分类通常是指源操作数)单操作数,双操作数数据操作数,转移地址操作数1.数据操作数:立即数、寄存器操作数、内存操作数、I/O操作数MOVAL,#20HMOVAL,BLMOVAL,2000HINAL,83H2.转移地址操作数:主要用于跳转和程序调用3.2数据寻址方式数据寻址;转移地址寻址;I/O端口寻址第3章8086/8088指令系统与寻址方式-2-寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。寻址方式一般是针对源操作数而言的。在8086/8088系统中,一般将寻址方式分为两种不同的类型,一类是寻找操作数的地址,另一类是寻找要执行的下一条指令的地址,即程序的地址。8086/8088的基本寻址方式有六种,下面我们来讨论这六种寻址方式。3.2.1立即寻址所提供的操作数直接包含在指令中,这种寻址方式就叫立即寻址,这个操作数叫立即数。所谓立即数是指具有固定数值的操作数,即常数。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图3-1所示。例如:MOVAX,2345H存储器AHALMOV操作码代45H码23H段图3-1立即寻址立即数若是8位的,可以是无符号数,取值范围是00H-0FFH,也可以是带符号数,取值范围是80H-7FH。立即数若是16位的,可以是无符号数,取值范围是0000H-0FFFFH,也可以是带符号数,取值范围是8000H-7FFFFH。若是16位的,则存储时低位在前,高位在后。在指令中,立即数操作数只能作源操作数,而不能作目的操作数。立即寻址主要用来给寄存器或存储单元赋初值。3.2.2直接寻址操作数地址的16位偏移量直接包含在指令中,所以这种寻址方式叫直接寻址。16位偏移量与操作码一起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图3-2所示。例如:MOVAX,DS:[3000H]存储器第3章8086/8088指令系统与寻址方式-3-图3-2直接寻址方式(对DS来讲可以省略成MOVAX,[3000H],系统默认为数据段)这种寻址方式是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。这种寻址方式允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。MOVAX,[2000H];数据段MOVBX,ES:[3000H];段超越,操作数在附加段即绝对地址=(ES)X16+3000H3.2.3寄存器寻址操作数包含在CPU的内部寄存器中,所以这种寻址方式叫寄存器寻址。它们可以是数据寄存器(8位或16位),也可以是地址指针寄存器、变址寄存器或段寄存器,如寄存器AX、BX、CX、DX、SI等。如图3-3所示。例如:MOVBX,AXMOVAL,BH图3-3寄存器寻址方式3.2.4寄存器间接寻址操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中,所以这种寻址方式叫寄存器间接寻址。可以分成两种情况:以SI、DI、BX间接寻址,则通常操作数在现行数据段区域中,即数据段寄存器(DS)X16(或10H)加上SI、DI、BX中的16位偏移量,为操作数的地址,如图3-4所示。例如:MOVAX,[SI]操作数地址是:(DS)X16+(SI)DSSI4000H2000H40000+)200042000存储器以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)X16与BP的内容相加作为操作数的地址。例如:MOVAX,[BP]操作数地址是:(SS)X16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。第3章8086/8088指令系统与寻址方式-4-例如:MOVAX,DS:[BP]操作数地址是:(DS)X16+(BP)3.2.5变址寻址(又称为寄存器相对寻址)由指定的寄存器内容,加上指令中给出8位或16位的偏移量(当然要由一个段寄存器作为基地址)作为操作数的偏移地址,称为变址寻址。(操作数在存贮器中)可以作为变址寻址的四个寄存器是SI、DI、BX、BP。(1)若用SI、DI和BX作为变址,则与数据段寄存器相加,形成操作数的地址默认在数据段。存储器DSSI4000H2000H400002000+)002042020图3-5变址寻址方式(2)若用BP变址,则与堆栈段寄存器相加,形成操作数的地址默认在堆栈段。例如:MOVAX,DATA[SI];指令的执行过程如图3-5所示操作数地址是:(DS)X16+(SI)+DATA假设(DS)=4000H,(SI)=2000H,DATA=0020H则物理地址=4000HX10H+2000H+0020H=42020H但是,只要在指令中指定是段超越的,则可以用别的段寄存器作为基地址。在汇编语言中,变址寻址指令的书写格式允许有几种不同的形式。以下几种写法实质上是完全等价的:MOVAH,DATA[BX]MOVAH,[BX]DATAMOVAH,DATA+[BX]MOVAH,[BX]+DATAMOVAH,[DATA+BX]MOVAH,[BX+DATA]另外,在有的教科书中,若指定的寄存器是BX,BP又称为基址寻址方式。3.2.6基址加变址寻址把BX(数据段)和BP(堆栈段)看成是基址寄存器,把SI、DI看着是变址寄存器,把一个基址寄存器(BX或BP)的内容加上一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位偏移量(当然要以一个段寄存器作为地址基准)作为操作数的偏移地址,称为基址加变址寻址。第3章8086/8088指令系统与寻址方式-5-操作数在存贮器中,其偏移地址由(基址寄存器)+(变址寄存器)+相对偏移量形成。例如:MOVAX,[BX][SI]DATA或MOVAX,[BX+SI]DATA操作数地址是:(DS)X16+(BX)+(SI)+DATA假设(DS)=4000H,(BX)=2000H,(SI)=2000H,DATA=0100H则物理地址=4000HX10H+2000H+2000H+0100H=44100H指令的执行过程如图3-6所示DSBXSI4000H2000H2000H40000存储器20002000+)010044100图3-6基址加变址寻址方式与变址寻址方式类似,基址加变址寻址指令同样也可以表示成多种形式,例如,以下几种写法实质上是完全等价的:MOVAX,DATA[BX][SI]MOVAX,[BX+DATA][SI]MOVAX,[DATA+BX+SI]MOVAX,[BX]DATA[SI]MOVAX,DATA[SI+BX]MOVAX,[BX][SI+DATA]使用基址加变址寻址时要注意,指令中不允许同时出现两个基址寄存器或两个变址寄存器,例如,以下指令是非法的:MOVAX,DATA[SI][DI]MOVAX,[BX+DATA][BP]另外,在有的教科书中,若DATA为0,则称为基址变址寻址方式;则若DATA不为0,则称为基址变址相对寻址方式。基址变址相对寻址方式实为基址变址寻址方式的扩充。若用BX作为基地址,则操作数在数据段区域。若用BP作为基地址,则操作数在堆栈段区域。但若在指令中规定是段超越的,则可用其它段寄存器作为基地址。第3章8086/8088指令系统与寻址方式-6-表3-1段寄存器使用的基本约定访问存储器类型默认段寄存器可指定段寄存器段内偏移地址来源取指令码CS无IP堆栈操作SS无SP串操作源地址DSCS、ES、SSSI串操作目的地址ES无DIBP用作基址寄存器SSCS、DS、ES根据寻址方式求得有效地址一般数据存取DSCS、ES、SS根据寻址方式求得有效地址3.3指令格式及指令执行时间3.3.1指令格式图3–7不同字长的指令格式3.3.2指令执行时间取指令,取操作数,执行指令及传送结果所需时间的总和。3.48086/8088指令系统8086/8088的指令系统可以分为以下六个功能组。1.数据传送(DataTranster)2.算术运算(Arithmetic)3.逻辑运算(Logic)4.串操作(Stringmenipulation)5.程序控制(ProgramControl)6.处理器控制(ProcessorControl)3.4.1数据传送指令主要介绍MOV,XCHG、堆栈和地址传送指令。1.数据传送MOV指令一般格式:MOVOPRD1,OPRD2MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。功能:完成数据传送具体来说,一条数据传送指令能实现:⑴CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。MOVAL,BL;字节传送MOVCX,BX;字传送第3章8086/8088指令系统与寻址方式-7-MOVDS,BX⑵立即数传送至CPU内部的通用寄存器组(即AX、BX、CX、DX、BP、SP、SI、DI),MOVCL,4MOVAX,03FFHMOVSI,057BH⑶CPU内部寄存器(除了CS和IP以外)与存储器(所有寻址方式)之间的数据传送。MOVAL,BUFFERMOVAX,[SI]MOV[DI],CXMOVSI,BLOCK[BP]MOVDS,DATA[SI+BX]MOVDEST[BP+DI],ES⑷能实现用立即数给存储单元赋值例如:MOV[2000H],25HMOV[SI],35H对于MOV指令应注意几个问题:①存储器传送指令中,不允许对CS和IP进行操作;②两个操作数中,除立即寻址之外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;如我们需要把地址(即段内的地址偏移量)为AREAl的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中去,MOV指令不能直接完成这样的传送,但我们可以CPU内部寄存器为桥梁来完成这样的传送:MOVAL,AREAlMOVAREA2,AL③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;如:MOVAX,0;MOVDS,AX④目的操作数,不能用立即寻址方式。2.堆栈指令(简述堆栈的概念及存取特点,如先进后出)包括入栈(PUSH)和出栈(POP)指令两类。仅能进行字运算。(操作数不能是立即数)⑴入栈指令PUSH一般格式:PUSHOPRD源操作数可以是CPU内部的16位通用寄存器、段寄存器(CS除外)和内存操作数(所有寻址方式)。入栈操作对象必须是16位数。功能:将数据压入堆栈执行步骤为:SP=SP-2;[SP]=操作数低8位;[SP+1]=操作数高8位例如:PUSHBX执行过程为:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如图2-8所示。⑵出栈指令POP图3-8堆栈操作示意第3章8086/8088指令系统与寻址方式-8-一般格式:POPOPRD功能:将数据弹出堆栈对指令执行的要求同入栈指令。例如:POPAXPOP[BX]POPDS3.交换指令XCHG一般格式:XCHGOPRD1,OPRD2功