微机原理 第四章-指令系统_第1页
微机原理 第四章-指令系统_第2页
微机原理 第四章-指令系统_第3页
微机原理 第四章-指令系统_第4页
微机原理 第四章-指令系统_第5页
已阅读5页,还剩165页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《微机原理与接口技术》主讲:田娟

信息工程学院电子信息教研室邮箱:jtian@电话4章指令系统4.1数据类型及其存储规则(了解)4.2计算机指令格式(了解)4.38086的寻址方式(重点)4.48086的指令系统(重点)4.5DOS和BIOS中断(重点)§4.1数据类型及其存储规则

4.1.1基本数据类型及其存储数据在存储器中常以字节为单位进行存储,一个字节占用内存的一个地址,称为一个存储单元。

8086微处理器指令系统中的基本数据类型为:字节、字。当多于一个字节的数据存储时,其存储规则是高位字节存储在地址号高的存储单元中,低位字节存储在地址号低的存储单元中。

图4-1基本数据类型的结构形式§4.1数据类型及其存储规则

4.1.2数字数据类型数字数据类型包含三部分,即:

无符号整数。当选择字节时,范围是0~255;当选择字时,范围是0~65535。

带符号整数。当选择字节时,范围是-128~+127;当选择字时,范围是-32768~+32767。

浮点数。◆带符号数的表示方法计算机中的带符号的数,用二进制编码表示,数的符号也用二进制表示。带符号的数有三种表示方法:1、原码2、反码3、补码数X的原码记作[X]原反码记作[X]反补码记作[X]补在进行运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定和的符号位,从而使计算机的结构变得复杂化。为了解决机器内复数的符号位参加运算的问题,引入了反码和补码两种机器数形式。补充知识◆带符号数的表示方法(续)补充知识☆原码表示法:原码用数的最左边一位(MSB)表示数的正负,即在D7或D15位加0或1。

符号位:0表示正,1表示负;数值位:真值的绝对值。☆反码表示法:若X>0,则[X]反=[X]原若X<0,则[X]反=对应原码的符号位不变,数值部分按位求反。◆带符号数的表示方法(续)补充知识☆补码表示法:若X>0,则[X]补=[X]反=[X]原若X<0,则[X]补=[X]反+1§4.1数据类型及其存储规则

4.1.3指针数据类型指针是内存单元的地址,在实方式下有两种类型的指针:

近指针(near)是段内的16位偏移量(称为有效地址)远指针(far)是一个32位的逻辑地址,不仅包含16位有效地址,而且包含了16位段地址。§4.1数据类型及其存储规则

4.1.4字符串、位及位串数据类型

字符串包括字节串、字串和双字串,它们分别是字节、字和双字的相邻序列,其格式如图4-4所示,其中N为地址,分别以字节、字和双字为单位存取。§4.2计算机指令格式

引言计算机处理各种数据或完成某些其他任务都是通过执行具体指令来实现的。指令除了说明计算机做什么,还要指出数据的来源、操作结果的去向一条指令包括两部分:指令操作码(OperationCode)部分和地址码部分。指令操作码部分是给出该指令应完成何种操作,其长度(代码位数)取决于指令系统中的指令条数。地址码部分是用来描述该指令的操作对象,如给出参与操作的操作数的值是多少或者指出操作数存放在何处、操作的结果应送往何处等信息。根据地址码部分所给出地址的个数,指令格式可分为:零地址指令、一地址指令、二地址指令和三地址指令。零地址指令指只有操作码部分,而没有操作数的指令。一地址指令指只有目的操作数的单操作数指令。二地址指令指有两个地址指出两个操作数的指令,这是最常见的指令格式。三地址指令的优点是操作结束后,原两个操作数的内容均未被破坏;其缺点是增加一个地址后,使指令码加长,增加了存储空间,取指时间变长。§4.2计算机指令格式

引言(续)

4.2.1指令的助记符格式§4.2计算机指令格式80x86微处理器指令的助记符格式可用以下通式表示:

L:opDl,D2,D3L是标号,在标识符后面跟有冒号(:)。

op是助记符,具有相同功能的指令操作码的保留名。

D1、D2、D3是任选的操作数参数,可以有零至三个。参数的个数取决于指令操作码,可形成四种指令格式(零地址指令、一地址指令、二地址指令和三地址指令)。

最常用的是二地址指令格式,这种格式的指令中存在两个操作数,右边的是源操作数,左边的是目的操作数。补充知识

[标号:]操作码助记符[操作数][;注释]其中[]为任选项。汇编语言指令语句的一般格式标号:该指令所在地址的符号名称,后必跟“:”。由字母a~z或A~Z、数字0~9或特殊字符(@,-,?)组成;必须由字母a~z或A~Z或特殊字符(@,-,?)开头,数字不能开头,?不能单独使用。有效长度为31个字符。标号不能使用指令助记符。规则:

操作码助记符:是指令名称的代表符号,不可缺省。

操作数:是参加本指令运算的数据,可以缺省。

注释:如果带注释,前面必须用“;”开头。该项可以缺省。

说明:操作数可以用表达式来表示,可在指令、寄存器、存储器中存取。通常将指令执行过程中保持原值不变的操作数称为源操作数;若操作数原值不保留,而将存放此操作数的地址用来存放运行结果值,则称此操作数为目的操作数。

[标号:]操作码助记符[目的操作数][,源操作数][;注释]

补充知识§4.2计算机指令格式

4.2.280x86指令编码格式(自学)见课本P82~85。计算机中的指令有些不需要操作数,大多数指令采用一个或两个操作数。一般来说,操作数可以跟随在指令操作码之后,称为立即数;操作数也可以存放在CPU内部的寄存器中,称为寄存器操作数;绝大多数的操作数存放在内存储器中,称为存储器操作数。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种寻找操作数的过程称为寻址,而寻找操作数的方法称为寻址方式。补充知识-几个重要概念§4.38086的寻址方式

引言寻址方式就是指令中说明操作数所在地址的方法。操作数可以包含在寄存器、存储器或I/O端口地址中,也可以是立即数。操作数在寄存器中的指令执行速度最快(寄存器寻址),因为它们可以在CPU内部立即执行。立即数寻址指令可直接从指令队列中取数,所以执行速度也较快。操作数在存储器中的指令执行速度较慢,因为它要通过总线与CPU之间交换数据,当CPU进行读写存储器的操作时,必须先把一个偏移量送到BIU,计算出20位物理地址,再执行总线周期去存取操作数。§4.38086的寻址方式

4.3.1立即寻址在立即寻址(ImmediateAddressing)方式下,操作数直接包含在指令中,它是一个8位或16位的常数(只能是整数,不能是小数、变量或者其他类型的数据),也叫立即数。该指令翻译成机器码时,立即数作为指令的一部分,紧跟在操作码之后,存放在代码段内。立即寻址方式的指令常用来给寄存器赋初值。立即数不但可以送到寄存器中,而且还可以送到一个存储单元(8位)中或两个连续的存储单元(16位)中去。要强调的是,在所有的指令中,立即数只能作源操作数,不能作目的操作数,位数要与目的操作数的位数一致。

以A~F打头的数字出现在指令中时,前面一定要加一个数字“0”,以免与其它符号相混淆。

如:MOVCX,2A50H;将立即数2A50H送到CX寄存器中。指令的机器码存放及执行过程如图4-8所示。图4-8MOVCX,2A50H执行过程2A50CLCHCX代码段:操作码502AMOVCX,2A50H指令代码:§4.38086的寻址方式

4.3.2寄存器寻址在寄存器寻址(RegisterAddressing)方式下,操作数包含在寄存器中,由指令指定寄存器的名称。

对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。

对于8位操作数,则用寄存器AH、AL、BH、BL、CH、CL、DH和DL。

源操作数的长度必须与目的操作数一致,否则会出错。如:MOVCL,AH;它表示将AH中的8位数据传送到CL寄存器。MOVCX,AH;错误书写已知(AX)=3A68H,(DX)=18C7H,则执行指令MOVDX,AX后,(DX)=?,而AX=?例题:答案:(DX)=3A68H

,而AX=3A68H。§4.38086的寻址方式

4.3.3直接寻址在IBMPC机中,把操作数的偏移地址称为有效地址EA。使用直接寻址方式(DirectAddressing)的指令时,存储单元的EA直接由指令给出,在机器码中,EA存放在CS指令的操作码之后。须先求出操作数的物理地址,然后再访问存储器,才能取得操作数。指令中的常数地址必须用方括号括起来,以便与立即数相区别。如:

MOVAX,[2000H];当采用直接寻址指令时,若指令中没有用前缀指明操作数存放在哪一段,则默认为段寄存器为DS,因此操作数的物理地址=DS×16+EA。如果要对CS、SS或ES寄存器所指出的存储区进行直接寻址,应在指令中指定段超越前缀。如:MOVAX,ES:[500H];这里的冒号“:”称为修改属性运算符,该指令的源操作数的物理地址即为16×ES+500H。如:MOVAX,[2000H]

该指令给出操作数的有效地址EA=2000H,设DS=3000H,则源操作数的物理地址=3000H×16H+2000H=32000H。该指令执行完,把地址32000H处的一个字送进AX。若地址32000H中的内容为34H,32001H中的内容为12H。则执行指令后,(AX)=1234H。指令执行过程见图4-9所示。若指令为:MOVAL,[2000H]

假设所有条件都和图4-9相同,则该指令执行后将存储单元(32000H)=34H中的字节送到AL中,结果为(AL)=34H。图4-9MOVAX,[2000H]执行过程示意图3000DS+200032000×10H:3412320001234ALAHAX数据段:代码段:操作码0020MOVAX,[2000H]指令代码:执行指令MOVBX,[1070H]后,BX=?练习:答案:BX=5634H。§4.38086的寻址方式

4.3.4寄存器间接寻址指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址,这种寻址方式称为寄存器间接寻址。

寄存器名称外面必须加方括号,以与寄存器寻址方式相区别。这类指令中使用的寄存器有基址寄存器BX、BP及变址寄存器SI、DI。如果指令中指定的寄存器是BX、SI或DI,则默认操作数存放在DS中,这时要用数据段寄存DS的内容作为段地址。若指令中用寄存器BP进行间接寻址,则默认操作数在SS段中,操作数的段地址在SS中。如:MOVAX,[BP]例4-2设DS=1000H,SI=2000H,(12000H)=318BH;分析指令MOVBX,[SI]执行后寄存器BX的结果。图4-10例4-2指令执行过程示意图1000DS+SI200012000×10H:8B3112000318BBLBHBX数据段:代码段:操作码0020MOVBX,[SI]指令代码:答案:BX=318BH。§4.38086的寻址方式

4.3.5寄存器(间接)相对寻址寄存器相对寻址方式的操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。对BX、SI、DI这三个间址寄存器,指示的是数据段中的数据;而用BP作间址寄存器,则指示的是堆栈段中的数据。寄存器相对寻址方式与寄存器间接寻址相似,主要区别是前者在有效地址上要加一个位移量(即带位移量的寄存器间接寻址)如:MOVBX,COUNT[SI]等价于MOVBX,[COUNT+SI]这种寻址方式也允许使用段超越前缀。例4-3设DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=5678H,分析指令“MOVBX,COUNT[SI]”执行后寄存器BX的结果。执行结果:BX=5678H。图4-11例4-3指令执行过程示意图20003000DSSI+COUNT400036000×10H:7856360005678BLBHBX数据段:代码段:操作码0040MOVBX,COUNT[SI]指令代码:§4.38086的寻址方式

4.3.6基址变址寻址(基址寄存器加变址寄存器间接寻址)基址加变址寻址(BasedIndexedAddressing)方式,操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指定。如:MOVAX,[BX][SI]等价于MOVAX,[BX+SI]

例4-4设DS=3000H,BX=1200H,SI=0500H,(31700H)=ABCDH,分析指令“MOVAX,[BX][SI]”执行后寄存器AX的结果。图4-12例4-4指令执行过程示意图:CDAB31700ABCDALAHAX数据段:代码段:操作码MOVAX,[BX][SI]指令代码:+317000500SI3000DS×10H1200BX执行结果:AX=ABCDH。§4.38086的寻址方式

4.3.7相对基址变址寻址(基址寄存器加变址寄存器间接相对寻址)相对基址变址寻址(RelativeBasedIndexedAddressing)方式的操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。如:MOVAX,MASK[BX][SI]MOVAX,[MASK+BX+SI]MOVAX,200H[BX+SI]MOVAX,MASK[BX+SI]

例4-5设DS=2000H,BX=1500H,SI=0300H,MASK=0200H,(21A00H)=26BFH,分析指令“MOVAX,MASK[BX][SI]”执行后寄存器AX的结果。执行结果:AX=26BFH图4-13例4-5指令执行过程示意图1500BX+MASK020021A002000DS×10H:BF2621A0026BFALAHAX数据段:操作码操作码00代码段:MOVAX,MASK[BX][SI]指令代码:0300SI02

寻址方式中,只有三种操作数类型:立即数、寄存器、存储器;可以按源、目的操作数分别确定寻址方式;寻址方式约定了隐含段寄存器,但允许超越;存储器操作,读/写速度最慢;寄存器操作,读/写速度最快;在涉及操作数的地址时,常常要在指令中使用方括号,有关带方括号的地址表达式必须遵循下列规则:立即数可以出现在方括号内,表示直接地址,例如[2000H]。

只有BX、BP、SI、DI这4个寄存器可以出现在[]内,它们可以单独出现,也可以由几个寄存器组合起来(只能相加),或以寄存器与常数相加的形式出现,但BX和BP寄存器不允许出现在同一个[]内,SI和DI也不能同时出现。

小结小结§4.48086的指令系统

引言就8086CPU而言,其指令系统共有133条指令。按功能分类,8086的指令共有六大类,分别是:数据传送指令、算术运算指令、逻辑运算和移位指令、字符串处理指令、控制转移指令以及处理器控制指令。表4-4中列出指令中的操作数的简写符号,是从IntelIA-32手册上摘录下来的。用这些符号来描述Intel指令的格式。表4-4指令中的操作数表示法操作数描述r88位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DLr1616位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BPr3232位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBPreg任意的通用寄存器sreg16位段寄存器:CS,DS,SS,ES,FS,GSimm8位、16位或32位立即数imm88位立即数(字节)imml616位立即数(字)imm3232位立即数(双字)r/m88位操作数(可以是8位通用寄存器或内存字节)r/m1616位操作数(可以是16位通用寄存器或内存字)r/m3232位操作数(可以是32位通用寄存器或内存双字)mem8位、16位或32位内存操作数DOPDSrc源操作数,dst目的操作数§4.48086的指令系统

4.4.1数据传送指令数据传送指令用来把数据或地址传送到寄存器或存储器单元中,共14条,可分为4组:

通用数据传送指令

累加器专用传送指令

地址传送指令

标志传送指令格式:MOVDST,SRC;操作:DST←SRCMOV指令允许在CPU的寄存器之间、存储器和寄存器之间传送字节和字数据,(操作数类型要匹配,字对字,字节对字节传送)也可将立即数送到寄存器或存储器中(如图4-14所示)。注意:IP寄存器不能用作源操作数或目的操作数,目的操作数也不允许用立即数和CS寄存器;除了源操作数为立即数外,两个操作数中必有一个是存器,但不能都是段寄存器。MOV指令不能在两个存储单元之间直接传送数据(源和目的不能同为存储器操作数),也不能在两个段寄存器之间直接传送数据。

MOV指令不影响标志寄存器的值。

通用数据传送指令☆

MOV传送指令(Move)图4-14MOV允许传送数据的途径通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL段寄存器CS,DS,ES,SS存储器立即数从通用寄存器到通用寄存器。立即数传送到通用寄存器。通用寄存器和存储单元之间。立即数传送到存储单元。段寄存器与通用寄存器间的数据传送。

段寄存器与存储单元间的数据传送。

允许的MOV指令的形式有如下几种:小结MOVreg1,reg2MOVreg,immMOVmem(reg),reg(mem)MOVmem,immMOVseg,reg或MOVreg,segMOVsreg,mem或MOVmem,sreg小结不能在两个存储单元之间传送。立即数不能送段寄存器。段寄存器之间不能传送。

CS不能做目的但可做源操作数。不允许的MOV指令的形式有如下几种:MOV[1000H],[2000H]MOVDS,300HMOVDS,ESMOVCS,AXMOVAX,CSMOVAX,BL××∨小结修改:MOVAX,300HMOVDS,AX×××修改:MOVAX,[2000H]MOV[1000H],AX通用数据传送指令☆PUSH进栈指令(PushWordontoStack)原则:按“后进先出”原则设计的数据区。堆栈段地址:由SS段寄存器提供。堆栈区操作数据地址:由堆栈指针寄存器SP提供。SP的初值是指向的地址为栈底,进行堆栈数据操作后SP指向栈顶地址。格式:PUSHSRC;将源操作数(SRC)推入堆栈。(SP)←(SP)-2,((SP)+1,(SP))←(SRC)(先减后压)说明:源操作数是16位通用寄存器、段寄存器或存储器中的数据字,不能是立即数。有下列形式:PUSHreg/mem/sreg。进栈指令不影响标志位。通用数据传送指令☆POP出栈指令(PopWordoffStack)格式:POPdst;把当前SP所指向的堆栈顶部的一个字送到指定的目的操作数中。(DST)←((SP)+1,(SP)),(SP)←(SP)+2(先出后加)说明:有下列形式:POPreg/mem/sreg。其中CS可以压栈但不能作目的操作数。标志位不受影响。

例4-6设SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次执行下列指令后堆栈中的数据和SP的变化情况如何?PUSHBXPUSHAXPOPBXPOPAX20000:000020000:003C20000:0040FE252031AX=25FEHBX=3120H(c)执行PUSHAX指令后SP20000:000020000:003E20000:0040FE252031AX=25FEHBX=25FEH(d)执行POPBX指令后SP图4-15PUSH和POP指令执行过程20000:000020000:0040AX=25FEHBX=3120H(a)指令执行前SP20000:000020000:003E20000:00402031AX=25FEHBX=3120H(b)执行PUSHBX指令后SP通用数据传送指令☆XCHG交换指令(Exchange)格式:XCHGOPR1,OPR2;操作:(OPR1)(OPR2)说明:交换可以在reg之间、reg与mem之间进行,但sreg不能作为操作数,也不能直接交换两个存储单元中的内容。举例:设AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H,执行下面指令:XCHGAX,[BX+200H]后,它把内存中的一个字与AX中的内容进行交换,源操作数的物理地址=3000×10H+1800H+200H=31A00H,该地址处存放的字数据为1995H。因此,指令执行后,AX=1995H,(31A00H)=2000H。格式:XLAT表首地址或XLAT操作:(AL)←((BX)+(AL))。将AL中的值(码)转换为内存表格中的某一值,再送回AL中说明:使用XLAT指令之前必须先建立一个表格,并将转换表的起始地址装入BX寄存器中。AL中事先也送一个初值,该值等于表头地址与所要查找的某一项之间的位移量。表格中的内容则是要转换的代码,表格最多包含256个字节。执行XLAT指令后,根据位移量可以从表中查到转换后的代码值,并自动送入AL寄存器中,得到所需结果。累加器专用传送指令☆XLAT表转换指令累加器专用传送指令☆输入输出指令(I/O指令)I/O指令是专门面向输入输出端口进行读写的指令。输入指令IN:用于从I/O端口读数据到累加器AL(或AX)中;输出指令OUT:用于将累加器AL(或AX)中的数据写到I/O端口。8086/8088的I/O指令中,只允许用两种寻址方式:

直接寻址方式:指令中包含了一个8位的I/O端口地址,允许寻址256个端口,端口地址为0~0FFH。

寄存器间接寻址方式:端口地址由DX寄存器指定,可寻址64K个端口(0~0FFFFH)。间接寻址的适用范围较大,在编写程序时要尽量采用这种方式。INAL,PORT

;直接寻址,PORT为8位立即数,表示端口地址,从PORT端口读一个字节送ALINAX,PORT

;直接寻址,从PORT和PORT+l两个端口读一个字送AXINAL,DX

;间接寻址,16位端口地址由DX指出,从(DX)所指的端口读一个字节送ALINAX,DX

;间接寻址,从(DX)和(DX+1)所指的两个端口读一个字到AX,;低地址端口的内容送入AL,高地址端口的内容送入AH☆输入指令IN(Intput)☆输出指令OUT(Output)OUTPORT,AL

;将AL中的一个字节输出到PORT端口OUTPORT,AX

;将AX中的一个字输出到PORT和PORT+l两个端口OUTDX,

AL

;DX中为端口地址,将AL中的字节送(DX)所指的端口OUTDX,

AX

;将AX中的字送(DX)和(DX)+l所指的两个端口INAL,0F1H INAX,80H

MOVDX,3l0H INAL,DXOUT85H,AL MOVDX,0FF4HOUTDX,AL MOVDX,300H OUTDX,AX 举例:地址传送指令☆取有效地址指令:LEA(LoadEffectiveAddress)格式:LEAreg16,mem;(reg16)←mem的偏移地址功能:取源操作数地址的偏移量,并把它传送到目的操作数制定的寄存器。标志位:不受影响。LEA指令要求源操作数必须是存储单元,而且目的操作数必须是一个除CS之外的16位寄存器。注意它与MOV指令的区别,MOV指令传送的一般是源操作数中的内容而不是地址。地址传送指令☆将双字指针送到寄存器和DS的指令:LDS格式:LDSreg16,mem32功能:从mem32指定的存储单元地址开始,将连续4字节单元中的内容,分别送入制定寄存器reg16和DS中。其中前2个字节(变量的偏移地址)送到reg16,后2个字节(变量的段地址)送入DS寄存器。标志位:不受影响。指令中的reg16通常使用SI寄存器,不能使用sreg。mem32必须是存储单元,从该存储单元开始的连续4个字节单元中,存放着一个变量的地址指针。地址传送指令☆将双字指针送到寄存器和ES的指令:LES格式:LESreg16,mem32功能:该指令与LDS指令的操作基本相同,不同的是要将mem32所指向的地址指针中的段地址部分送到ES寄存器中,不是DS寄存器,reg16常用DI寄存器。标志传送指令☆LAHF(LoadAHfromFlags)标志寄存器低8为送入AH格式:LAHF功能:把标志寄存器SF、ZF、AF、PF和CF分别传送到AH寄存器的位7,6,4,2和0,位5,3,1的内容未定义,可以是任意值。执行指令后,标志位不受影响。☆SAHF(StoreAHintoFlags)AH送标志寄存器低8位格式:SAHF功能:把AH内容存入标志寄存器。这条指令与LAHF的操作相反,它把寄存器AH中的7,6,4,2,0位传送到标志寄存器的SF、ZF、AF、PF和CF位,高位标志OF、DF、IF和TF不受影响。☆PUSHF(PushFlagsontoStack)标志寄存器入栈指令格式:PUSHF☆POPF(PopFlagsoffStack)标志出栈指令格式:POPF§4.48086的指令系统

4.4.2算术运算指令8086/8088指令系统提供了加、减、乘、除四种基本运算指令,可处理无符号或带符号的8位或16位二进制数的算术运算,还提供了各种调整操作指令,故可进行压缩的或非压缩的十进制数的算术运算。☆

ADD(Addition)加法指令格式:ADDDST,SRC操作:DST←SRC+DST☆ADC(AdditionwithCarry)带进位的加法指令格式:ADCDST,SRC操作:DST←DST+SRC+CF说明:这两条指令的SRC可以是reg、mem或imm,DST只能用seg和存储单元。

源和目的操作数不能同时为存储器,且类型必须一致。这两条指令影响的标志位为:CF、OF、PF、SF、ZF和AF。加法指令☆INC(Increment)增量指令格式:INCOPR操作:OPR←OPR+1说明:OPR操作数可以在通用reg或内存中。该指令主要用在循环程序中对地址指针和循环计数器等进行修改。指令执行后影响AF、OF、PF、SF和ZF,但CF不受影响。INC在对内存操作时必须加WORDPTR[]、BYTEPTR[]指令。

AAA(ASCIIAdjustforAddition)加法的ASCII调整指令格式:AAA;非压缩BCD码加法累加器调整指令功能:在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后,运算结果已存在AL的情况下,AAA指令将AL寄存器中的运算结果调整为非压缩十进制数,仍保留在AL中,如果AF=1,表示向高位有进位,则进到AH寄存器中。加法指令例4-8若AH=0,AL寄存器中存放BCD码数9,BL寄存器中存放BCD码数5,写出两寄存器相加的指令语句。解:指令语句如下:ADDAL,BL

AAA00001001…9+00000101…500001110…低4位>9+00000110…加6调整00010100∧00001111…清高4位00000100…AL=4CF=1,AF=1,AH=1结果为AX=0104H,表示非压缩十进制数14。

调整过程为:若AL低4位>9或半进位标志AF=1,则:AL←AL+6;用与操作(∧)将AL高4位清0;

AF置1,CF置1,AH←AH+1。否则,仅将AL寄存器的高4位清0。格式:DAA功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。相加后的结果必须在AL中,才能使用DAA指令。调整过程为:做加法后AL中的低半字节﹥9或AF=1,则AL←AL+6,对低半字节进行调整。做加法后AL中高半字节结果﹥9或CF=l,则AL←AL+60H,对高半字节进行调整,并使CF置l,否则CF置0。加法指令☆DAA(DecimalAdjustforAddition)加法的十进制调整指令(压缩BCD码加法累加器调整指令)例4-9若AL寄存器中存放BCD码数88,BL寄存器中存放BCD码数49,写出两寄存器相加的指令语句。解:指令代码如下:ADDAL,BLDAA10001000…88+01001001…4911010001…AF=1+00000110…加6调整11010111…调整后高半字节>9∧01100000…加60H调整00110111…结果为AL=BCD37,CF=1减法指令☆

SUB(Subtraction)不带借位的减法指令格式:SUBDST,SRC操作:DST←DST-SRC。☆SBB(SubtractwithBorrow)带借位的减法指令格式:SBBDST,SRC操作:DST←DST-SRC-CF☆

DEC(Decrement)减1指令格式:DECOPR操作:OPR←OPR-1

格式:AAS功能:在用SUB或SBB指令对两个非压缩十进制数或以ASCII码表示的十进制数进行相减后,对AL中所得结果进行调整,在AL中得到一个正确的非压缩十进制数之差。如果有借位,则CF置1。AAS指令必须紧跟在SUB或SBB指令之后。调整过程为:若AL寄存器的低4位﹥9或AF=1,则:AL←AL-6,AF置1;将AL寄存器高4位清零;AH←AH-1,CF置1。否则,不需要调整。☆

AAS(ASCIIAdjustforSubtraction)减法的ASCII调整指令减法指令☆

DAS(DecirnalAdjustforSubtraction)减法的十进制调整指令减法指令格式:DAS功能:在两个压缩十进制数用SUB或SBB相减后,结果已存在AL中的情况下,对所得结果进行调整,在AL中得到正确的压缩十进制数。同样,它也要对AL中高半字节和低半字节分别进行调整。调整过程为:如果AL寄存器的低4位﹥9或AF=1,则:AL←AL-6,AF置1。如果此时AL高半字节﹥9或标志位CF=1,则:AL←AL-60H,CF置1。☆

NEG(Negate)取负指令(取补指令)格式:NEGOPR;按位取反加1(包括符号位)操作:OPR←0-OPR(或OPR←-OPR)。注意:取补指令不同于补码!!举例:MOVAL,73HNEGAL;AL=?减法指令答案:AL=8DH☆CMP(Compare)比较指令格式:CMPDST,SRC功能:即:DST-SRC,结果不回送到目的操作数中,仅将结果反映在标志位上,可用条件跳转指令决定程序的去向。说明:比较指令主要用在希望比较两个数的大小,而又不破坏原操作数的情况。

减法指令乘法指令☆MUL(Multiply)无符号数乘法指令格式:MULSRC操作:字节操作数:AX←AL×SRC字操作数:(DX,AX)←AX×SRC说明:SRC可以是寄存器,或是存储单元,但不能是立即数。当SRC是存储单元时,必须在操作数前加B或W说明是字节还是字。举例:MULBYTEPTR[SI]MULWORDPTR[BX]

MULDL说明:MUL指令执行后影响CF和OF标志。乘法指令使AF、PF、SF和ZF的状态不定。如果结果的高半部分(字节操作为AH、字操作为DX)不为零,表明其内容是结果的有效位,则CF和OF均置1。否则,CF和OF均清0。☆MUL(Multiply)无符号数乘法指令(续)乘法指令☆IMUL(Integer

Multiply)带符号数乘法指令乘法指令格式:IMULSRC操作:同MUL指令。功能:把乘数和累加器中的数都作为带符号数,进行相乘。乘积的符号符合一般代数运算规则。说明:如果乘积的高半部分不是低半部分的符号扩展(不是全零或全1),则视高位部分为有效位,表示它是积的一部分,于是置CF=1,OF=1。若结果的高半部分为全零或全1,表明它仅包含了符号位,那么使CF=0,OF=0。利用这两个标志状态可决定是否需要保存积的高位字节或高位字。IMUL指令执行后,AF、PF、SF和ZF不定。☆DIV(Divisionunsigned)无符号数除法指令除法指令格式:DIVSRC操作:字节除数:AL←AX/SRC的商;AH←AX/SRC的余数。字除数:AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余数。说明:被除数、除数、商及余数均为无符号数。6个状态标志均无定义。☆IDIV(IntegerDivision)带符号数除法指令除法指令格式:IDIVSRC操作:字节除数:AL←AX/SRC的商;AH←AX/SRC的余数。字除数:AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余数。说明:被除数,除数、商及余数均为带符号数,商的符号符合一般代数运算的符号规则,余数的符号与被除数相同。6个状态标志均无定义。商超过了目标寄存器AL或AX所能存放数的范围。这时系统会自动产生一个中断类型号为0的除法错中断,相当于执行了除数为0的运算,所得的商和余数都不确定。这类指令的功能是对操作数最高位进行扩展,用于处理带符号数运算时的操作类型匹配问题。☆

CBW(ConvertBytetoWord)把字节扩展为字指令格式:CBW功能:AL中字节的符号位扩展到AH中(即把AL中的最高位送入AH的所有位)☆CWD(ConvertWordtoDoubleWord)把字扩展成双字指令格式:CWD功能:把AX中字的符号位扩展到DX中(即把AH中的最高位送入DX的所有位)标志:不影响任何标志位。符号扩展指令补充例题:MOVAL,10011010B;CBW ;AX=1111111110011010B=0FF9AHAL=10011010B=9AHMOV DX,0;MOV AX,0FFABH;CWD ;(DX)=0(AX)=0FFABH(DX)=0FFFFH,(AX)=0FFABH§4.48086的指令系统

4.4.3逻辑运算与移位指令逻辑运算和移位指令对字节或字操作数进行按位操作,这类运算可分成:逻辑运算(LogicalOperations)算术逻辑移位(shiftArithmeticandShiftLogical)循环移位(Rotate)逻辑运算指令☆逻辑与指令AND格式:ANDDEST,SRC

操作:DEST←(DEST)(SRC)说明:运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0逻辑运算指令☆逻辑或指令OR格式:ORDEST,SRC

操作:DEST←(DEST)∨

(SRC)说明:运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。格式:XORDEST,SRC;(DEST)←(DEST)(SRC)说明:运算法则为:1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。逻辑运算指令☆逻辑异或指令XOR☆测试指令TEST格式:TESTDEST,SRC;FLAGS←(DEST)(SRC)功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址,只影响标志位。逻辑运算指令☆逻辑非指令NOT:格式:NOTDEST;DEST←()功能:将目的地址中的内容逐位取反后送入目的地址。补充知识:逻辑运算指令小结逻辑运算指令的操作均是按位进行的。逻辑非NOT指令只有一个操作数。目的操作数可以是8位或16位寄存器或存储器。对于存储器操作数,要说明其类型是字节还是字。指令执行后,对标志位无影响。其余逻辑运算指令均为双操作数指令,SRC可以是8位或16位立即数、寄存器或存储器,DST只能是寄存器或存储器,两个操作数不能同时为存储器。指令执行后,均将CF和OF清0,ZF、SF和PF反映操作结果,AF未定义,源操作数不变。

AND指令常用来对一个数据的指定位清零;

OR指令可用来对一些指定的位置置1;

XOR指令可用于将操作数的某些位取反;

TEST指令则常用于检测某些数据的指定位是1还是0。小结算术逻辑移位指令☆算术左移指令SAL格式:SALDST,CNT最低位CF0最高位SAL移动☆逻辑左移指令SHL格式:SHLDST,CNT最低位CF0最高位SHL移动算术逻辑移位指令☆算术右移指令SAR格式:SARDST,CNT☆逻辑右移指令SHR格式:SHRDST,CNT最低位最高位CFSAR移动0最低位最高位CFSHR移动移位指令实现对操作数的移位操作。逻辑移位把操作数看成无符号数来移位,右移时,最高位补0,左移时,最低位补0算术移位则把操作数看做有符号数,右移时最高位(符号位)保持不变,左移时,最低位补0DST可以是8位、16位寄存器或存储器操作数。CNT为移位计数值,可以设定为1,也可以由寄存器CL确定其值。小结小结SHL和SAL两条指令的功能完全相同,在机器中实际对应同一种操作。对标志位影响的情况是:AF总是无定义。PF、SF和ZF在指令执行后被修改。CF总是等于目的操作数最后被移出去的那一位的值。OF的值多次移位的情况下是不确定。在移位次数为1的情况下,如果最高位(符号位)的值被改变,则OF标志置1,否则OF清0。移位操作还可以实现对一个数乘以2n或除以2n的运算,这种方法的运算速度要比直接使用乘除法高很多。逻辑移位指令适用于无符号数运算,SHL用来乘以2n,SHR用于除以2n;算术移位指令用于对带符号数运算,SAL用来乘以2n,SAR用于除以2n。

小结(续)小结循环移位指令☆不带进位位的循环左移指令ROL格式:ROLDST,CNT☆不带进位位的循环右移指令ROR格式:RORDST,CNTCFROLROL移动CFRORROR移动循环移位指令☆带进位位的循环左移指令RCL格式:RCLDST,CNT☆带进位位的循环右移指令RCR格式:RCRDST,CNTCFRCLRCL移动CFRCRRCR移动小结小结4条指令都按指令中计数值规定的移位次数进行循环移位,移位后的结果仍送回目的操作数。目的操作数可以是8/16位的寄存器操作数或内存操作数,循环移位的次数可以是1,也可以由CL寄存器的值指定。这4条指令中,ROL和ROR指令没有把进位标志CF包含在循环中,而RCL和RCR指令把CF作为整个循环的一部分,一起参加循环移位。OF位只有在移位次数为1的时候才有效,在移位后当前最高有效位(符号位)发生变化时,则OF标志置1,否则OF置0。在多位循环移位时,OF的值是不确定的。CF的值总是由最后一次被移出的值决定。§4.48086的指令系统

4.4.4串操作指令字符串(String)是指一系列存放在存储器中的字或字节数据。字符串长度可达64K字节,组成字符串的字节或字称为字符串元素,每种字符串指令对字符串中的元素只进行同一种操作。8086提供5条1字节的字符串操作指令,专门对存储器中的字节串和字串数据进行。分类:传送(MoveString)、比较(CompareString)、扫描(ScanString)、存储(StoreString)、装入(LoadString)。

字符串的传送MOVS格式1:MOVSB;(ES:DI)(DS:SI),SISI±1,;DIDI±1格式2:MOVSW;(ES:DI)(DS:SI),SISI±2,;DIDI±2功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。在使用MOVS指令进行字符串传送时,传送方向由DF控制。如果源字符串与目标字符串不重迭,则传送方向可以任意。▲注意(a)源和目的不重叠,DF取值任意

源串目的串低地址高地址若源字符串与目标字符串部分重迭,则传送方向要特别注意。当源字符串的地址低于目标字符串的地址时,则应该自动减量(置DF=1),从高地址开始传送。(b)源和目的下重叠,

DF=1

源串目的串低地址高地址当源字符串的地址高于目标字符串的地址时,则应该自动增量(置DF=0),从低地址开始传送。源串目的串低地址高地址(c)源和目的上重叠,

DF=0

格式1:CMPSB;FLAGS(DS:SI)-(ES:DI),;SISI±1,DIDI±1格式2:CMPSW;FLAGS(DS:SI)-(ES:DI),;SISI±2,DIDI±2字符串的比较指令CMPS功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。字符串的扫描指令SCAS功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。利用SCAS指令,可在内存中搜索所需要的数据。被搜索的数据也称为关键字。指令执行前,先将关键字存在AL(字节)或AX(字)中,才能用SCAS指令进行搜索。格式1:SCASB;FLAGSAL-(ES:DI),DIDI±1格式2:SCASW;FLAGSAX-(ES:DI),DIDI±2字符串的装入指令LODS格式1:LODSB;AL(DS:SI),SISI±1格式2:LODSW;AX(DS:SI),SISI±2字符串的存储指令STOS格式1:STOSB;(ES:DI)AL,DIDI±1格式2:STOSW;(ES:DI)AX,DIDI±2为了加快串运算指令的执行速度,可在基本指令前加重复前缀,使数据串指令重复执行。每重复执行一次,地址指针SI和DI都根据方向标志DF自动进行修改,CX的值则自动减1。

REP:REP前缀用在MOVS指令前。功能:每执行一次串指令,(CX)-1,直到(CX)=0,重复执行结束。

REPZ

:该指令一般用在CMPS、SCAS指令前。功能:每执行一次串指令,(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。

REPNZ

:该指令一般用在CMPS、SCAS指令前。功能:每执行一次串指令,(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。重复过程:1、检测CX。若CX=0,则退出串操作;否则继续执行2。2、完成一次串操作。3、修改地址指针,SISI±1(或2)DIDI±1(或2)。4、CXCX-15、若重复前缀为REP,则转1执行;若重复前缀为REPZ,且ZF=1时,则转1执行;否则退出串操作;若重复前缀为REPNZ,且ZF=0时,则转1执行;否则退出串操作。表4-10串操作指令及重复前缀分组指令名称命令格式操作串操作指令串传送(字节,字串传送)MOVSDST,SRC(MOVSB,MOVSW)(ES:DI)←(DS:SI),SI←SI±1或2,DI←DI±1或2串比较(字节,字串比较)CMPSDST,SRC(CMPSB,CMPSW)(ES:DI)−(DS:SI),SI←SI±1或2,DI←DI±1或2串扫描(字节,字串扫描)SCASDST,SRC(SCASB,SCASW)AL或AX−(ES:DI),DI←DI±1或2取串(取字节,字串)LODSSRC(LODSB,LODSW)AL或AX←(DS:SI),SI←SI±1或2存串(存字节,字串)STOSDST(STOSB,STOSW)(ES:DI)←AL或AX,DI←DI±1或2重复前缀无条件重复前缀REP使其后的串操作重复执行,每执行一次,CX的内容减1,直至CX=0相等/为零重复前缀REPE/REPZ当ZF=1且CX≠0时,重复执行其后的串操作,每执行一次,CX的内容减1,直至ZF=0或CX=0不相等/不为零重复前缀REPNE/REPNZ当ZF=0且CX≠0时,重复执行其后的串操作,每执行一次,CX的内容减1,直至ZF=1或CX=0小结源串位于当前数据段中,由DS寻址,源串的元素由SI作指针,即源串字符的起始地址(或末地址)为DS:SI,源串允许使用段超越前缀来修改段地址。目的串必须位于当前附加段中,由ES寻址,目的串元素由DI作指针,即目的串字符的起始地址(或末地址)为ES:DI,但目的串不允许使用段超越前缀修改ES。如果要在同一段内进行串运算,必须使DS和ES指向同一段。每执行一次字符串指令,指针SI和DI会自动进行修改,以便指向下一待操作单元。DF标志控制字符串处理的方向。要处理的字符串长度(字节或字数)放在CX寄存器中。补充知识如果已知两个数据块的内容基本上是相同的,若要寻找其中是否有不一致的地方,则应使用CMP指令查找,并在CMP指令前使用REPE/REPZ前缀。如果已知两个数据块的内容基本是不相同的,若要寻找其中相一致的地方,则应使用CMP指令查找,并在CMP指令前使用REPNE/REPNZ前缀。例4-22要求把数据段DS中以SRC_MESS为偏移地址的一串字符“HELLO!”,传送到附加段ES中以NEW_LOC开始的单元中,写出其指令代码?解:实现该操作的程序如下:

DATASEGMENT

;数据段

SRCMESSDB‘HELLO!’ ;源串

DATAENDS

EXTRASEGMENT

;附加段

NEWLOCDB6DUP(?);存放目的串

EXTRAENDS

CODESEGMENT

;代码段

ASSUMECS:CODE,DS:DATA,ES:EXTRA程序头START:MOVAX,DATA MOVDS,AX;DS←数据段段址 MOVAX,EXTRA MOVES,AX ;ES←附加段段址 LEASI,SRCMESS;SI指向源串偏移地址

LEADI,NEWLOC;DI指向目的串偏移地址 MOVCX,6 ;CX作串长度计数器 CLD ;清方向标志,地址增量DF=0

REPMOVSB ;重复传送串中的各字节直到

;CX=0为止

CODEENDS

ENDSTART本例中的REPMOVSB指令也可用以下几条指令代替:AGAIN:MOVSNEWLOC,SRCMESSDECCXJNZAGAIN初始化例4-23在某一字符串中搜寻是否有字符A,若有,则把搜索次数记下来,送到BX寄存器中,若没有查到,则将BX寄存器清0。写出其指令代码。解:设字符串起始地址STRING的偏移地址为0,字符串长度为CX。程序段如下:MOVDI,OFFSETSTRING ;DI=字符串偏移地址(相对于LEADI,STRING)MOVCX,COUNT ;CX=字符串长度MOVAL,‘A’ ;AL=关键字A的ASCII码CLD ;清方向标志REPNESCASB;CX≠0(没查完)和ZF=0(不相等)时重复JZFIND;若ZF=1,表示已搜到,转出MOVDI,0 ;若ZF=0,表示没搜到,DI=0FIND:MOVBX,DI;BX=搜索次数HLT;停机

例4-24若在数据段中有一个数据块,起始地址为BLOCK,数据块中的数为8位带符号数,要求将其中所含的正、负数分开,然后把正数送到附加段中始址为PLUS_DATA的缓冲区,负数则送到附加段中始址为MINUS_DATA的缓冲区。写出其指令代码。

解:可以将这块数据看成一个数据串,用SI作源串指针,DI和BX分别作正、负数目的缓冲区的指针,CX用于控制循环次数,可写出如下程序段:START:MOVSI,OFFSETBLOCK ;SI为源串指针

MOVDI,OFFSETPLUS_DATA;DI为正数目的区指针

MOVBX,OFFSETMINUS_DATA;BX为负数目的区指针

MOVCX,COUNT ;CX放循环次数

CLDGOON:LODSBBLOCK;AL←取源串的一个字节

TESTAL,80H ;是负数?JNZMINUS ;是,转MINUSSTOSB ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论