《微型计算机原理与接口技术》课件第4章 2_第1页
《微型计算机原理与接口技术》课件第4章 2_第2页
《微型计算机原理与接口技术》课件第4章 2_第3页
《微型计算机原理与接口技术》课件第4章 2_第4页
《微型计算机原理与接口技术》课件第4章 2_第5页
已阅读5页,还剩224页未读 继续免费阅读

下载本文档

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

文档简介

4.1指令寻址方式4.1.1操作数类型计算机指令是由操作码和操作数所组成的。操作码指出指令的功能,操作数则是指令的处理对象。所谓寻址方式,就是寻找指令中操作数所在地址的方法。为了方便说明,我们先看看操作数的类型,然后再讨论寻址方式。操作数类型有三种:立即数、寄存器操作数、存储器操作数。

(1)立即数。立即数是作为指令代码的一部分出现在指令中的,它通常作为源操作数使用。在汇编指令中,可以用二进制、十六进制或十进制等数制形式表示,也可以写成一个可求出确定值的表达式形式。

(2)寄存器操作数。寄存器操作数是把操作数存放在寄存器中,即用寄存器存放源操作数或目的操作数。通常在汇编指令中,给出寄存器的名称,并在双操作数指令中作源操作数,也可以作目的操作数。有的指令,虽然没有明确给出寄存器名,但它隐含着某个通用寄存器作操作数。具体在哪些指令中隐含使用,在指令系统中将会进行说明。

(3)存储器操作数。存储器操作数是把操作数放在存储器中,因此,在汇编指令中应给出的是存储器的地址。

应该说明的是,存储器操作数所在的存储器地址应该是物理地址,即由段地址和段内地址(我们把相对于段首地址的偏移量称为有效地址EA)所决定。但在汇编指令中,通常只给出有效地址EA(它们是以各种寻址方式给出的),而段址(在段寄存器中)是通过隐含方式使用的。4.1.2有效地址EA和段超越

当操作数是存放在存储器中时,存储器的存储单元的物理地址有两部分组成,一部分是偏移地址,一部分是段地址。在8086/8088的各种寻址方式中,寻找存储单元所需的偏移地址可由各种成分组成,称为有效地址,用EA表示。不同的寻址方式,组成有效地址EA的各部分内容也不一样。

存储器操作数寻址时,存储单元的物理地址的另一部分是段地址。8086/8088指令系统中对段地址有个基本规定,即所谓Default(默认)状态。在正常情况下,由寻址方式中有效地址规定的基地址寄存器来确定段寄存器,即只要寻址方式中出现BP寄存器作为基地址,段寄存器一定采用堆栈段SS段寄存器,其余的情况都采用数据段DS段寄存器。指令中的操作数也可以不在基本规定的段区内,但必须在指令中指定段寄存器,这就是段超越。

例如:

MOVAL,[2000H]

此存储单元的物理地址为16×DS+2000H,数据是存放在数据段中。

而 MOVAI,ES:[2000H]

储单元的物理地址为16×ES+2000H,此指令传送的源数据却在数据段中。段地址的基本规定(或约定)和允许超越的情况如表3-1所示。4.1.3寻址方式

有了对操作数类型和有效地址EA和段超越的了解,就可以较容易地理解8086/8088的寻址方式了。

1.立即数寻址

立即数寻址的操作数是一个立即数,它直接包含在指令中。立即数可为8位数,也可以为16位数,它们放在指令代码的操作码后(若为16位数,则低字节数在前,高字节数在后)。其寻址示意图如图4-1所示。图4-1立即数寻址示意图例如:

MOVAX,IM

其中,IM是立即数。立即数只能作为源操作数出现在指令中。

立即数寻址主要是用于给存储器或寄存器赋初值。它可能是一个运算数也可能是一个地址值。它们都可以用一个符号名来表示。

2.直接寻址

直接寻址指的是操作数的地址(即16位偏移量)直接包含在指令中。它也同立即数寻址一样放在指令操作码后(低字节在前,高字节在后)。

直接寻址给出的是操作数偏移量地址,实际操作数地址应由段寄存器和这个直接地址相加来决定。

例如:

MOVAX,[22A0H]

这是一个直接寻址指令,其寻址示意图如图4-2所示。此种寻址以数据段为基址,故寻址范围可为64 KB。图4-2直接寻址示意图寻址方式除隐含使用段寄存器外,8086/8088系统还允许利用段超越方法使用段寄存器。只要在有效地址前写上要使用的段寄存器名及冒号“:”,此时将不再使用隐含段寄存器,而使用给定的寄存器以形成真正的物理地址。

例如:

MOVAX,ES:[22A0H]

其中ES为段超越,表明形成物理地址所要使用的段寄存器。

在汇编指令中,可使用符号名地址(标号或变量)进行直接寻址。它们和使用符号名表示数据的立即数寻址是十分相似的,很难直接判定它们,此时必须通过符号名原来的定义来判定。例如:

DATS SEGMENT

DATA DW 10DUP(?)

MOV AX,DATS

;储存器段地址(高16位),送入AX,为立即数寻址

MOV AX,DATA ;变量值送入AX,为直接寻址

3.寄存器寻址

寄存器寻址所要寻找的操作数在通用寄存器中,它们可以做源操作数或目的操作数,所用的寄存器可以为8位寄存器或16位寄存器。

例如:

MOVAX,BX

图4-3所示为寄存器寻址示意图。寄存器寻址可以使用任何一个通用寄存器,但使用累加器AX时,指令执行时间要短些。图4-3寄存器寻址示意图

4.寄存器间接寻址

寄存器间接寻址是指要寻址的操作数在存储器中,它的地址(16位偏移量)在寄存器中,操作数地址通常放在SI、DI、BX、BP寄存器中。

8086系统规定,使用SI、DI、BX间接寻址时,操作数在数据段中,应由数据段寄存器DS与间接寻址的寄存器一起形成操作数的物理地址。

例如:

MOVAX,[SI]

其寻址示意图如图4-4所示。图4-4寄存器间接寻址示意图当使用BP间接寻址时,操作数在堆栈段中,应由堆栈段寄存器SS与间接寻址的寄存器BP形成操作数的物理地址。

例如:

MOVAX,[BP]

其寻址示意图如图4-5所示。寄存器间接寻址也可以使用段超越方式工作。图4-5用BP寄存器间接寻址示意图

5.变址寻址

变址寻址的操作数也在存储器中。变址寻址是指使用SI、DI、BX、BP与指令中给定的位移量一起形成有效地址。

例如:

MOVAX,[SI+5]

它表示将SI的内容加上指令中给定的位移量5作为偏移地址,并将该地址的内容传送到AX。其隐含的段为DS。当然,使用段超越方式时,可以用其它段寄存器。

例如:

MOVAX,DTAB[SI]

其变址寻址示意图如图4-6所示。图4-6变址寻址示意图

6.基址变址且相对寻址

以BX、BP作为基址寄存器,以SI、DI作为变址寄存器构成的存储器寻址方式称为基址变址且相对寻址。

例如:

MOVAX,MDAT[BX][SI]

其寻址示意图如图4-7所示。如用BX作基址,则段寄存器使用DS;如用BP作基址,则段寄存器使用SS;如使用段超越方式,则段寄存器使用指定的段寄存器。图4-7基址变址且相对寻址示意图

7.端口寻址

在寻址外设端口时,使用端口寻址,它有两种寻址方式。一种是直接端口寻址,端口地址为8位立即数(0~255);另一种是间接端口寻址,端口地址放在DX寄存器中(可为16位数,值为0~65535)。

例如:

OUT 21H,AL ;AL内容送21H端口输出

MOV DX,380H ;DX作间接端口寻址

OUT DX,AL ;AL内容送380H端口输出

其寻址方式示意图如图4-8所示。图4-8端口寻址示意图

8.隐含寻址

在8086系统中,有部分指令的操作数没有给出任何说明,但计算机根据操作码即可确定其所要操作的对象,此种寻址方式称为隐含寻址。它的操作对象是固定的,故也称固定寻址。

例如:

AAA ;隐含对AL操作

LES ;隐含对ES操作

XLAT ;隐含对AL,BX操作通过对寻址方式的熟悉,有助于对指令的深入理解和正确编写程序。使用寄存器寻址的指令,可以减少指令码长度,而且因不需要到存储器中存取数据,所以执行速度也较快。存储器寻址(寄存器间址、变址、基址加变址)不但指令码变长,而且计算有效地址需要花费额外的时间,所以指令执行时间变长。确定有效地址的因素越多,则执行的时间就越长。但确定有效地址的因素越多,使用起来就越灵活。比如,基址加变址寻址可以随时改变基址寄存器或变址寄存器内容,对数据区数据的查寻和处理十分方便;变址寄存器寻址可以解决线性数组的存取处理;基址加变址寄存器寻址可以解决矩阵数组的存取处理。4.2指令系统

8086/8088指令系统可按功能划分为九类。下面分别介绍各类指令的格式、功能和对状态标志位的影响,并通过一些小例子说明它们的使用,以使对每个指令有正确的理解和运用。

1.数据传送指令数据传送指令用来实现寄存器和存储器间的字节或字数据传送。与数据传送有关的另一些指令,如堆栈操作、数据交换、标志传送以及地址传送等,虽也实现数据的传送,但它们有自己的特殊功能,故也一并放在数据传送类中讲述。下面分述6组传送指令。

1)数据传送指令MOV(Move)

指令格式:MOVOPRD1,OPRD2

OPRD1为目的操作数,可以是寄存器、存储器、累加器;OPRD2为源操作数,可以是寄存器、存储器、累加器和立即数。

功能:将一个源操作数(字节或字)传送到目的操作数中。传送方向示意图如图4-9所示。图4-9数据传送方向示意图说明:本组指令不影响状态标志位。MOV指令可细分为四种传送类别。

(1)寄存器与寄存器之间的数据传送。

例如:

MOV AX,BX

MOV DL,AH

MOV CX,DX

MOV DX,ES

MOV BP,SI

MOV DS,AX

注意:代码段寄存器CS和指令指针IP不参与数据传送。严格地说,CS可作为源操作数参加数据传送。

(2)立即数到通用寄存器的数据传送。

例如:

MOV AL,25

MOV AX,1000

MOV BX,052AH

MOV CH,5

MOV SI,OFFSETTABLE

MOV SP,2AC0H

注意:立即数只能作源操作数,不允许作目的操作数。

(3)寄存器与存储器之间的数据传送。

例如:

MOV AL,BUFFER

MOV AX,[SI]

MOV LAST[BX+DI],DL

MOV SI,ES:[BP]

MOV DS,DATA[BX+SI]

MOV ALFA[BX+DI],ES

注意:代码段寄存器CS和指令指针IP不参与数据传送,严格地说,CS可作为源操作数参加数据传送。

(4)立即数到存储器的数据传送。

例如:

MOV ALFA,25

MOV DS:MEMS[BP],300AH

MOV BYTEPTR[SI],15

MOV LAST[BX][DI],OFFH

注意:立即数向储存器传送数据时,一定要使立即数与存储器变量类型一致。

MOV指令不具有存储器单元之间的数据传送功能。若要进行存储器单元间的数据传送,只能借助于通用寄存器间接传递。

例如,把ALFA1单元的内容送ALFA2单元中,ALFA1和ALFA2是同一数据段的二个变量。则可通过下面两条指令传送:

MOV AL,ALFA1 ;取单元数据→AL

MOV ALFA2,AL ;存单元数据←AL

【例4-1】在DATA1处有100个数据,传送到DATA2处,试编程实现。

可利用循环程序完成100个数据的传送。设定一个数据传送计数器,每传送一个数,计数器减1,传送地址修改为下一个数据地址。直到全部数据传送完成为止。程序实现如下:

程序中,INC、DEC为增1和减1指令,JNZ为结果非零转移指令。

MOV指令使用规则如下:

(1) IP不能作目的寄存器;

(2)存储器单元之间不能直接进行数据传送;

(3)段寄存器之间不能直接用MOV指令直接进行数据传送;

(4)立即数不允许作为目的操作数;

(5)不允许立即数送到段寄存器;

(6)源操作数与目的操作数类型要一致。

2)堆栈操作指令PUSH和POP(PUSH&POP)

堆栈是在存储器(内存)中开辟出一个特定的位于堆栈段中的存储区,用作堆栈操作存入数据或地址和取出数据或地址。堆栈是以“后进先出”的原则进行数据操作的,也就是说最先存入堆栈的数据最后才能取出,最近存入的数据,可以最先取出。它就相当于手枪的子弹匣,最后压入的子弹总是首先被射出。堆栈操作遵循以下的原则:

(1)堆栈的存取每次必须是一个字(16位);

(2)向堆栈中存放数据时,总是从高地址向低地址方向增长(向下生成),而不像内存中的其他段,是从低地址开始向高地址存放数据,从堆栈取数据时正好相反;

(3)堆栈指令中的操作数只能是寄存器或存储器操作数,而不能是立即数;

(4)对堆栈的操作遵循“后进先出(LIFO)”的原则。最后压入堆栈的数据会最先被弹出;

(5)堆栈段在内存中的位置由SS决定,堆栈指针SP总是指向栈顶,即SP的内容等于当前栈顶的偏移地址。所谓栈顶,是指当前可用堆栈操作指令进行数据交换的存储单元,如图4-10所示。图4-10堆栈操作示意图堆栈的操作有两种:PUSH入栈操作和POP出栈操作。除此以外,CALL指令、RET指令,中断响应和返回都具有入栈出栈操作,见CALL和RET指令说明。

(1) PUSH指令。

指令格式:PUSHOPRD

OPRD为16位(字)操作数,可以是寄存器或存储器操作数。

功能:将寄存器或存储器单元的内容送入堆栈。

操作过程:(SP-l)←OPRDH(操作数高字节);

(SP-2)←OPRDL(操作数低字节);

(SP)←SP-2。

入栈操作示意图如图4-10(a)所示。例如:

PUSH AX

PUSH SI

PUSH SS

PUSH CS

PUSH BATA

PUSH ALFA[BX][SI]

说明:8086/8088系统入栈操作是由高地址向低地址扩展,即随着入栈内容的增加,SP值减小。SP操作后总是指向栈顶,即含有最后进栈数据字节的偏移量地址。

栈底在程序初始时设置,可用MOVSP,Im实现,Im为16位立即数。

(2)POP指令。

指令格式:POPOPRD

OPRD为16位(字)操作数,可以是寄存器或存储器操作数。

功能:将现行SP指向的堆栈内容(字)传送到寄存器或存储器单元中。

操作过程:OPRDL←(SP);

OPRDH←(SP+1);

(SP)←SP+2。

出栈操作示意图如图4-10(b)所示。例如:

POP AX

POP DI

POP DS

POP BETA

POP ALFA[BX][DI]

说明:出栈操作是由低地址向高地址扩展。随出栈内容的增加,SP值增大。SP操作后,指向新的栈顶。

PUSH指令和POP指令主要用来进行现场保护,以保证子程序调用或中断程序的正常返回。堆栈指令使用时应注意几点:

(1)堆栈操作总是按字进行的;

(2)不能从栈顶弹出一个字给CS;

(3)堆栈指针为SS:SP,SP永远指向栈顶;

(4) SP自动进行增减量(-2,+2)。

3)数据交换指令XCHG(eXCHanGe)

指令格式:XCHGOPRD1,OPRD2

OPRD1为目的操作数,OPRD2为源操作数,它们可为通用寄存器或存储器。

功能:实现源操作数和目的操作数内容的相互交换(字节或字)。可在累加器、通用寄存器或存储器之间相互交换,但两个存储器间不能直接交换。其操作示意图如图4-11所示。图4-11交换操作示意例如:

XCHG AX,BX

XCHG SI,AX

XCHG AL,BH

XCHG AX,BUFFER

XCHG BH,DATA[SI]

XCHG WORDA,CX

说明:本指令不影响状态标志位;段寄存器不能作为操作数;存储器间不能直接交换,可通过寄存器间接交换。例如,要实现存储器单元BET1和BET2间的内容交换,可用下面几种方法:

(1) MOV AX,BET1

XCHG AX,BET2

MOV BET1,AX

(2) PUSH BET1

PUSH BET2

POP BET1

POP BET2

(3) MOV AX,BET1

MOV BX,BET2

MOV BET1,BX

MOV BET2,AX

4)换码指令XLAT(TransLAT)

指令格式:XLATTABLE

TABLE为一个换码表首地址。

功能:把换码表中的一个字节内容传送到累加器AL中。

本指令执行前,应先将换码表首址送入BX寄存器中,要换码的字节在表中的位移量图4-12换码指令操作示意图(距表首址的距离)送入AL中。执行本指令后,将AL指向的换码表中的字节内容送到AL中,即AL←[BX+AL]。其操作示意图如图4-12所示。图4-12换码指令操作示意图说明:本指令不影响标志位。这是一条字节的查表转换指令,可以根据表中元素的序号查出表中相应元素的内容。为便于查找,应预先将要查找的这类代码排成一个表放在内存某个区域中。将表的首地址(偏移地址)送寄存器BX,要查找的元素的序号送AL,表中第一个元素的序号为0,然后依次为1,2,3,…,一执行XLAT指令后,表中指定序号的元素存于AL。本指令要求换码表长不得超过256个字节。本指令是一种特殊的类似于基址变址的寻址方式,非常方便于表的查询,常用于代码转换程序中。

5)标志传送指令

指令格式:

LAHF ;将标志寄存器低8位→AH

SAHF ;AH→标志寄存器的低8位

PUSHF ;将16位标志寄存器入栈

POPF ;将堆栈顶的内容出栈送标志寄存器

功能:实现标志寄存器内容与AH或堆栈间的传送。其操作示意图如图4-13所示。图4-13标志传送指令操作示意图说明:LAHF可以取出SF、ZF、AF、PF和CF标志,不影响原来标志位。SAHF可以存入新的SF、ZF、AF、PF和CF标志,影响原来的标志位。本指令可以用来改变标志位。PUSHF、POPF在子程序调用和中断服务程序中,用来保护和恢复标志寄存器,也可以用来修改某些标志(如TF),只要对入栈的标志寄存器内容进行修改后,再弹回标志寄存器即可。

6)地址传送指令

在程序设计中,常需要建立操作数地址。地址传送指令可以建立所需地址。

(1) LEA(LoadEffectiveAddress)。

指令格式:LEAOPRD1,OPRD2

OPRD1为目的操作数,可为任一16位通用寄存器。OPRD2为源操作数,可为变量名、标号或地址表达式。

功能:将源操作数给出的有效地址(即偏移量)传送到指定的寄存器中。例如:

LEA BX,TABLE

LEA DX,BATE[BX+SI]

LEA AX,[BP][DI]

说明:本指令对标志位无影响。本指令处理的是变量地址(偏移量),不是变量的值。它等效于传送有效地址的MOV指令,但MOV指令必须在变量名前使用OFFSET操作符。

例如:

LEABX,TABLE

等效于

MOVBX,OFFSETTABLE

(2) LDS(LoadDataSegmentregister)。

指令格式:LDSOPRDI,OPRD2

OPRD1为任一个16位通用寄存器。OPRD2为存储器地址(双字长地址指针)。

功能:将存储器地址指针所指向的双字中低地址中的字(标号或变量所在段的地址偏移量)送到给定的通用寄存器中,把双字的高地址中的字(标号或变量所在的段基址)送到DS寄存器中。

例如:

LDS SI,ABCD

LDS BX,FAST[SI]

LDS DI,[BX];[BX]、[BX+1]→DI;[BX+2];[BX+3]→DS

其操作示意如图4-l4所示。图4-14LDS、LES指令操作示意图说明:本指令不影响标志位。LDS加载的是双字存储器操作数,即4个连续字节加载到目标寄存器R及段寄存器DS中。本指令可为一个变量设置一个段地址和偏移量地址,以便于后续指令对其进行存取操作。

(3) LES(LoadExtraSegmentregister)。

指令格式:LESOPRD1,OPRD2

OPRD1为任一个16位通用寄存器。OPRD2为存储器地址(双字长地址指针)。

功能:将存储器地址指针所指向的双字低地址中的字送到给定的通用寄存器中,把双字的高地址中的字送到ES寄存器中。例如:

LES SI,ABCD

LES BX,FAST[SI]

LES DI,[BX]

其操作示意如图4-14所示。

说明:本指令不影响标志位,除段地址送ES寄存器外,其它操作与LDS指令操作相同。

2.算术运算指令

8086/8088是16位微处理器,可以实现加、减、乘、除四种基本运算,也可实现无符号数或有符号数的四则运算。通过调整指令可完成十进制数运算。

1)加法指令

(1)加法指令ADD(ADDition)。

指令格式:ADDOPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数、任一通用寄存器或存储器操作数。

功能:实现操作数OPRD1和OPRD2的相加,结果存入OPRD1中,即OPRD1←OPRD1+OPRD2。两个操作数的组合操作关系如图4-15所示。从图中可见,加法操作可以在通用寄存器(字节或字)间、通用寄存器与存储器间、立即数(字节或字)与通用寄存器间、立即数与存储器间进行,但不允许在两个存储器操作数间进行。图4-15加减法指令操作示意图例如:

ADD AL,25

ADD BX,0A0AH

ADD DX,DATA[BX]

ADD DI,CX

ADD BETA[SI],AX

ADD ALFA[BX],0FFH

ADD BYTEPTR[BX],28

说明:加法指令运算的结果对CF、OF、SF、PF、ZF、AF有影响。加法指令适用于有、无符号数的运算。加法指令可以进行字节或字加法运算,它们决定于给出的操作数的类型。

(2)带进位加法指令ADC(ADdwithCarry)。

指令格式:ADCOPRD1,OPRD2

功能:实现两个操作数和进位标志CF三者相加,结果存入目的操作数中。即OPRD1←OPRD1+OPRD2+CF。

例如:

ADC AL,3 ;AL←AL+3+CF

ADC AX,SI

ADC DX,MEMA

ADC AIFA[BX+DI],SI

ADC BATE,3254

ADC WORDPTR[BX][Sl],35说明:本指令影响标志位AF、CF、OF、PF、SF、ZF。带进位加法指令主要用于解决多字节运算时,字节间的进位计算问题。因为16位运算所表示的数值是有限的,所以可以用多字节表示一个大数。虽然指令本身只能进行一个或两个字节的运算,但可以通过从低位字节到高位字节逐字节(或字)相加(带进位)而获得两个大数相加运算。对有、无符号数均适用。例如,在DATA1和DATA2存储区各有4个字节的数据(低位数在低地址处),实现该二数相加的程序为

MOV AX,DATA1 ;取数1低字位数

ADD AX,DATA2 ;低字位数相加

MOV DATA3,AX ;存低字数位和

MOV AX,DATA1+2 ;取数1高字位数

ADC AX,DATA2+2

;高字位数相加,考虑低位和的进位

MOV DATA4,AX ;存高字位和数

(3)加1指令INC(INCrementbyl)。

指令格式:INCOPRD

OPRD可为任一通用寄存器或存储器操作数。

功能;将给定的操作数加1后,送回操作数中,即OPRD←OPRD+1图4-16加(减)指令操作示意图

本指令实现字节加1还是字加1决定于操作数的类型。其操作过程示意图如图4-16所示。图4-16加(减)指令操作示意图例如:

INC AH

INC SI

INC WORDPTR[BX]

INC BATE[BX+SI]

说明:本指令不影响进位标志CF,只影响AF、OF、PF、SF、ZF。本指令将操作数视为无符号数。它主要用在循环程序中,修改地址指针或循环计数器值,以实现循环处理。

(4)未组合十进制加法调整指令AAA(AsciiAdjustforAddition)。

指令格式:AAA

功能:对两个未组合十进数存在AL中的相加运算结果进行调整,产生一个未组合十进制数并存在AX中。

说明:前述加法指令均为对二进制数进行运算,为实现十进制数运算,可以按二进制运算后再进行十进制调整而完成十进制数运算。十进制数(BCD码)的存储方式分为未组合(非压缩)十进制数和组合(压缩)十进制数。前者(非组合的)表示一个字节只放一位十进制数,高4位为零;后者(组合的)表示一个字节放两个十进制数,高位数在高4位。

AAA指令是对两个未组合的十进制数加法运算(按二进制运算)的结果进行调整,使其成为一个十进制数和,故AAA指令要紧跟在加法指令之后使用。

调整操作:

若AL&0FH>9或AF=1,则AL←AL+6,AH←AH+1,AF←1,CF←AF,AL←AL&0FH。

例如:设AL=8,BL=3

ADD AL,BL ;AL←AL+BL=0BH

AAA ;AH=1,AL=1

上述调整中,加6操作是为变十六进制为十进位制所需要的。因为两种进制相差为6。本指令只影响标志位AF﹑CF。

(5)组合十进制加法调整指令DAA(DecimalAdjustAddition)。

指令格式:DAA

功能:对两个组合十进制数相加运算存于AL中的结果进行调整,产生一个组合的十进制数并存在AL中,其进位在CF中。

调整操作:

若AL&0FH>9或AF=1,则AL←AL+6,AF←1。

若AL&F0H>90H或CF=1,则AL←A+60H,CF←1。例如:AL=18H,BL=03H

ADD AL,BL ;AL+BL→AL=1BH

DAA ;AL=21H,AF=1

说明:本指令影响标志位AF﹑CF﹑PF﹑SF﹑ZF,它要紧跟在加法指令之后使用。如十进制数18,以组合十进制数方式存在AL中,其表示为18H。它表示的是二位十进制数18,而非十六进制数18H。这一点,在程序设计时要注意。

2)减法指令

(1)减法指令SUB(SUBwact)。

指令格式:SUBOPRD1,OPRD2

OPRD1为任一通用寄存器或储存器操作数。OPRD2为立即数,任一通用寄存器或储存器操作数。

功能:实现操作数OPRD1与OPRD2的相减,结果存入OPRD1中,即OPRD1←OPRD1-OPRD2。

两个操作数的组合操作关系如图4-15所示。例如:

SUB CX,BX

SUB [BX+26],AL

SUB DI,ALFA[Sl]

SUB AL,20

SUB GAMA[DI][BX],30A4H

说明:本指令影响标志位AF,CF,OF,PF,SF,ZF。操作数可为字节也可以为字类型。

(2)带借位减法指令SBB(SuBtractwithBorrow)。

指令格式:SBBOPRD1,OPRD2

功能:完成两个操作数和借位标志CF三者相减,结果存入目的操作数中,即OPRD1←OPRD1-OPRD2-CF。

例如:

SBB AX,DX;AX←AX-DX-CF

SBB DX,GAMA

SBB ALFA[BX+DI],SI

SBB BX,2000

SBB BETE[DI],30AH

说明:本指令只影响标志位AF,CF,OF,PF,SF,ZF,可以实现字节或字的减法运算。本指令主要用于多字节的减法运算。

(3)减1指令DEC(DECrementbyl)。

指令格式:DECOPRD

OPRD为任一通用寄存器或存储器操作数。

功能:将给定的操作数减1后回送到该操作数中,即OPRD←OPRD-1。其操作过程示意如图4-16所示。

例如:

DEC AL

DEC DI

DEC WORDPTR[DI]

DEC ALFA[DI+BX]

说明:本指令影响标志位AF,OF,PF,SF,ZF,不影响标志位CF。同样,本指令将操作数视作无符号数。

(4)求补指令NEG(NEGate)。

指令格式:NEGOPRD ;OPRD←0-OPRD

NEG指令的操作是用0减去操作数OPRD,结果送回该操作数。对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。

例如,若(AL)=0FCH,则执行NEGAL后,(AL)=04H,CF=1。本例中,0FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。

NEG指令对CF/OF的影响如下。

CF:操作数为0时,求补的结果使CF= 0,否则CF=1。

OF:当指定的操作数的值为80H(-128)或为8000H

(-32768)时,则执行NEG指令后,结果不变,即仍为80H或8000H,但OF=1,否则OF = 0。

(5)比较指令CMP(COMPare)。

指令格式:CMPOPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数,任一通用寄存器或存储器操作数。

功能:两个操作数相减,根据结果置标志位,但结果并不回送目的操作数中。比较数可为字节也可以为字数据,这取决于操作数类型。图4-17比较指令操作示意图其操作示意图如图4-17所示。图4-17比较指令操作示意图例如:

CMP AL,50

CMP AX,BX

CMP CX,COUNT[BX]

CMP BATE[DI],BX

说明:本指令主要通过比较(相减)结果置标志位,表示两个操作数的关系。比较有以下几种情况(以CMPA,B示例说明):

①若两个操作数相等,即A = B,则比较后ZF = 1,否则ZF = 0。因此,根据ZF标志可判定两数是否相等。

②两个无符号数判定大小。若A≥B,则不会产生借位;故CF=0;若A<B,则将产生借位,则CF=1。因此,可根据CF标志判定两个无符号数的大小。

③两个有符号数判定大小。有符号数的大小不能简单地靠单个标志位判定。下面分两种情况进行讨论。若A、B为同符号数(即A>0,B>0或A<0,B<0),则两数相减绝对值变小,不会溢出。此时可用SF标志位判定大小:

A≥B,SF=0;如(-2)-(-8) =+6。

A<B,SF=1。如(-8)-(-2) =-6。

若A、B为异号数(即A>0,B<0或A<0,B>0),则两数相减绝对值变大,有可能溢出。当未溢出时,判定可用SF标志。

A>B,SF=0;如(+2)-(-8)=+10。

A<B,SF=1。如(-8)-(+2)=-10。当溢出时,判定如下:

A>B,SF=1;如126-(-24)=150>127。

A<B,SF=0。如(-24)-(126)=-150<-128。

综上所述,可得有符号数的判定大小规则:

无溢出(OF=0)时,若SF=0,则A>B;

若SF=1,则A<B。

有溢出(OF=1)时,若SF=0,则A<B;

若SF=1,则A>B。为了便于记忆,对有符号数判定大小可概括为:有符号判定大小,既看“溢出”(OF)又看“符号”(SF),即

OF、SF同号,A>B

OF、SF异号,A<B

比较指令主要用于分支及循环程序设计中。根据比较结果,通过条件转移指令到相应程序段中。

在8086/8088指令系统中,专门提供了一组根据有符号数或无符号数比较大小后实现条件转移的指令,其转移条件就是根据上述判定原则进行的。所以,可以直接使用条件转移指令,而不必再经多次标志位判定决定转移,它为程序设计带来很大方便。

【例4-3】DATA缓冲区有100个有符号数,要求查找其中最大值,存入MAX单元中。

解可使用逐次比较法查找最大值。方法是取第一个数到AX中,从第二个数开始比较。若AX中值大,顺序进行下一个数的比较。若AX中值小,则把比较数送入AX,再继续顺序比较。经过99次比较后,显然AX中为最大值,将其送入MAX单元。

程序中,使用有符号数判定大小,通过转移指令控制99次循环。

(6)未组合十进制减法调整指令AAS(AscllAdustforSubtraction)。

指令格式:AAS

功能;对两个未组合十进制数相减存于AL中的结果进行调整,产生一个未组合的十进数存在AL中。

调整操作;

若AL&0FH>9或AF=1,则AL←AL-6,AH←AH-1,AF←1,CF←AF,AL←AL&0FH。否则,AL←AL&0FH。

说明:本指令影响标志位AF,CF。AAS指令紧跟在减法指令之后使用。

(7)组合十进制减法调整指令DAS(DecimalAdjustforSubtraction)。

指令格式:DAS

功能:对两个组合十进制数相减存于AL中的结果进行调整,产生一个组合的十进制数存在AL中。

调整过程:

若AL&0FH>9或AF=l,则AL←AL-6,AF←1,若AL&0F0H>90H或CF=1;则AL←AL-60H,CF←1。

说明:本指令影响标志位AF、CF、PF、SF、ZF。本指令应紧跟在减法指令之后使用。

3)乘法指令

8086的乘法指令包括无符号数乘法指令和有符号数乘法指令两种,采用隐含寻址方式,被乘数隐含在AL/AX中,而源操作数由指令给出。指令可完成字节数与字节数相乘及字与字相乘。对8位数的乘法,乘积为16位,存放在AX中;对16位数相乘,乘积为32位,高16位放在DX中,低16位放在AX中。

(1)无符号数乘法指令MUL(MULtiply)。

指令格式:MULOPRD

OPRD为通用寄存器或存储器操作数,作乘数。功能:完成两个无符号二进制数的相乘(被乘数隐含在累加器AL/AX中,乘数在OPRD中)。

字节乘法:AX←AL*OPRD

双字节长结果在累加器AX中(高位数在AH中)。若AH≠0,则CF=1,OF=1。

字乘法:DX,AX←AX*OPRD

双字长结果在DX及AX中(高位数在DX中)。若DX≠0,则CF=1,OF=1。例如:

MUL BETA[BX]

MUL DI

MUL ALFA;字节/字乘法,决定ALFA类型定义

说明:本指令影响标志位CF,OF。

在使用本指令时,是8位乘法还是16位乘法会决定源操作数(乘数)的类型定义。如源操作数为字节类型,则与AL中的数相乘,结果为双字节长;如果源操作数为字类型,则与AX中的数相乘,结果为双字长。若CF、OF置1,表明AH(或DX)中有乘积的高位有效数字。

【例4-4】设在M1和M2字单元中各有一个16位数,求其乘积并存于R起的字单元中。

解其主要操作数如下:

MOV AX,M1 ;取被乘数

MUL M2 ;两数相乘

MOV R,AX ;存结果

MOV R+2,DX

(2)有符号数乘法指令IMUL(IntegerMULtiply)。

指令格式:IMULOPRD

OPRD为任一通用寄存器或存储器操作数。

功能:完成两个有符号二进制数的相乘(被乘数隐含在累加器中,乘数为ORRD)。

字节相乘:AX←AL*OPRD

字相乘:DX,AX←AX*OPRD

若AH或DX不为0,则CF=1,OF=1。否则,CF=0,OF=0。

IMUL指令在格式上和功能上都与MUL指令类似,只是有如下几点区别:

①要求两乘数都必须为有符号数。

②若乘积的高半部分是低半部分的符号位的扩展,则CF=OF=0,否则CF=OF=1。

③指令中给出的源操作数应满足带符号数的表示范围。

例如:

IMUL SI

IMUL BL

IMUL BETA[BX]

说明:本指令影响标志位CF,OF。

(3)未组合十进制数乘法调整指令AAM(ASCllAdjustMultiply)。

指令格式:AAM

功能:对两个未组合十进制数相乘存于AX中的结果进行调整,产生一个未组合的十进制数存在AX中(高位数在AH中)。

调整操作:

AH←AL/10;

AL←ALMOD10

说明:本指令影响标志位为PF、SF、ZF。由于两个未组合十进制数相乘,结果的有效数仅在AL中,所以只对AL进行调整。本指令应跟在MUL指令后使用。例如:

MOV BL,05

MOV AL,08

MUL BL ;AX中为0028H

AAM ;AX中为0400H

4)除法指令

8086的除法指令也包括无符号数除法指令和有符号数除法指令两种,同样采用隐含寻址方式,隐含了被除数,而除数由指令给出,除数不能为立即数。

除法指令要求被除数的字长必须为除数字长的两倍。若除数为8位,则被除数为16位,并放在AX中;若除数为16位,则被除数为32位,放在DX和AX中,其中DX放高16位,AX放低16位。

(1)无符号数除法指令DIV(DIVision)。

指令格式:DIVOPRD

OPRD为任一通用寄存器或存储器操作数。

功能:实现两个无符号二进制数的除法运算。字节相除,被除数在AX中;字相除,被除数在DX,AX中。除数在OPRD中。

字节除法:AL←AX/OPRD,AH←AXMODOPRD。

字除法:AX←DX,AX/OPRD,DX←DX,AXMODOPRD。例如:

DIV BEAT[BXI

DIV CX ;商在AX,余数在DX中

DIV BL ;商在AL,余数在AH中

说明:本指令不产生有效的标志位。当除法商值产生溢出时(单字节大于0FFH,单字大于0FFFFH时),将置溢出位标志OF,产生一个类型0的溢出中断。

(2)有符号数除法指令IDIV(IntegerDIVision)。

指令格式:IDIVOPRD

OPRD为任一通用寄存器或存储器操作数。

功能:实现两个有符号数二进制的除法运算。字节相除,被除数在AX中;字相除,被除数在DX,AX中。除数在OPRD中。

字节除法:AL←AX/OPRD,AH←AXMODOPRD。

字除法;AX←DX,AX/OPRD,DX←DX,AXMODOPRD。例如:

IDIV DBYTE[BX]

IDIV CL

IDIV BX

说明:本指令不产生有效的标志位。当除数商值产生溢出(字节值超过 ±127,字值超过±32767范围时),将置溢出标志OF,产生一个类型0的溢出中断。

当被除数为8位数时,在进行除法运算前,除把被除数存入AL外,还应把AL的符号位扩展到AH中。同样,16位除法,除把被除数存入AX外,还应将AX的符号位扩展到DX中。

(3)字节扩展指令CBW(ConvertBytetoword)。

指令格式:CBW

功能:将AL寄存器的符号位扩展到AH中。

说明;本指令用于两个字节相除时,先用它形成一个2字节长的被除数。本指令不影响标志位。

例如:

MOV AL,25

CBW ;扩展符号位到AH中

IDIV BL

(4)字扩展指令CWD(ConvertWordtoDoubleword)。

指令格式:CWD

功能:将AX寄存器的符号位扩展到DX中。

说明:本指令用于两个字相除时,先用它形成一个2字长的被除数。本指令不影响标志位。

【例4-5】在A、B、C三个字型变量各存有16位有符号数a、b、c,实现(a*b+c)/a运算。

(5)未组合十进制数除法调整指令AAD(ASCllAdjustforDivision)。

指令格式:AAD

功能:把放在AX中的两个未组合十进制数进行调整,然后可按DIV指令实现两个未组合十进制数的除法运算,其结果为未组合十进制商(在AL中)和余数(在AH中)。

调整操作:AL←AH*10+AL,AH←0

例如:

MOV BL,5

MOV AX,0308H

AAD ;先进行十进制除法调整操作

DIV BL ;商在AL,余数在AH中说明:本指令影响标志位PF、SF、ZF。从调整操作可以看出,先把未组合十进制的被除数变为二进制数,然后再进行除法运算,其结果即为未组合十进制的商和余数。

如果商值小于10,则其商就是未组合十进制数。但当商值大于10时,就不是未组合的十进制数了,此时还需变换才能得到未组合的十进制数。一种简单的方法是将AH(其内容为余数)暂存到其它寄存器,然后利用AAM指令调整AL,使其成为二位未组合的十进制数,高位商在AH中,低位商在AL中。

注意:除法调整指令AAD是在除法运算前使用的,它对AX中的未组合十进制数进行调整,调整后再进行二进制除法运算。这与前述的加、减、乘法的调整过程是不同的。

3.逻辑运算指令

8086/8088可实现与、或、异或、非、测试等逻辑运算。

1)逻辑与运算指令AND

指令格式:ANDOPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数、任一通用寄存器或存储器操作数。

功能:对两个操作数实现按位逻辑“与”运算,结果送回目的操作数中,可为字节或字的“与”运算。例如:

AND AL,0FH

AND AX,BX

AND DX,BUFER[SI+BX]

AND BETA[BX],00FFH

说明:本指令影响标志位PF、SF、ZF,CF=0,OF=0。在同一通用寄存器自身相“与”时,操作数保持不变,但使CF置零。

本指令主要用于修改操作数,或置某些位为0。

2)逻辑或运算指令OR

指令格式:ORQPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数,任一通用寄存器或存储器操作数。

功能:对两个操作数实现按位逻辑“或”运算。结果送回目的操作数中。可为字节或字的“或”运算。例如:

OR AL,05H

OR AX,BX

OR BX,BUFER[SI]

OR BETA[BX],8000H

说明:本指令影响标志位PF、SF、ZF,CF=0,OF=0。对同一通用寄存器自身相“或”时,其操作数保持不变,但可使CF置零。本指令主要用于修改操作数,可使某些位置1,或对两个操作数组合。

3)逻辑非运算指令NOT

指令格式:NOTOPRD

OPRD为任一通用寄存器或存储器操作数。

功能:完成对操作数按位求反运算,结果送回原操作数。

例如:

NOT AL

NOT DI

NOT BETA[BX]

说明:本指令不影响标志位,可以实现按位求反操作,取操作数反码。

4)逻辑异或运算指令XOR(EXclusiveOR)

指令格式;XOROPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数,任一通用寄存器或存储器操作数。

功能:对两个操作数实现按位“异或”运算。结果送回目的操作数中。

例如:

XOR AL,0FH

XOR AX,BX

XOR CX,ALFA

XOR BUFER[BX+SI],0F0FH

说明:本指令影响标志位PF、SF、ZF,CF=0,OF=0。对同一通用寄存器自身相“异或”时,使结果为零,CF=0。常用来对寄存器及CF清零。可使用本指令修改操作数,对操作数中某些位作取反操作。

5)测试指令TEST

指令格式:TESTOPRD1,OPRD2

OPRD1为任一通用寄存器或存储器操作数。OPRD2为立即数,任一通用寄存器或存储器操作数。

功能:完成两个操作数的“与”运算。根据结果置标志位,但不改变操作数的值。例如:

TEST AL,0FH

TEST SI,0F00FH

TEST BETA「DI+BP」,AX

TEST BH,CL

说明:本指令影响标志位PF、SF、ZF,CF=0,OF=0。本指令可在不改变操作数的情况下,可对操作数的某一位或某几位状态进行测试。

【例4-6】BUF单元放有二位BCD数。要求将其转为ASCII码,存于ASC起的两个地址单元中,并测试有无字符为“0”的ASCII码。如有,则置CF=l,结束操作。

4.移位指令

移位指令完成对操作数的移位操作,分为一般移位和循环移位指令,它也是将操作数倍增和减半的有效方法。

1)一般移位指令

(1)逻辑左移指令SHL(SHiftlogicalLeft)。

指令格式:SHLOPRD,COUNT

OPRD为通用寄存器或存储器操作数。COUNT表示移位的次数。移位一次,COUNT=1,移位多次,COUNT=CL(CL中为移位的次数)。

功能:对给定的目的操作数(8位/16位)左移COUNT次。最高位移入CF中,最低位补零。其操作示意如图4-18所示。图4-18逻辑左移指令操作示意图例如:

移位1次 移位多次

SHL AL,1 MOV CL,3

SHL CX,1 SHL DX,CL

SHL ALFA[DI],1 SHL ALFA[DI],CL

说明:本指令影响标志位OF、PF、SF、ZF。CF决定移入的最高位。

本指令主要用于向左移位操作,但因为左移一位相当于权值提高一级,故本指令又常用作有、无符号数的倍增操作。但请注意,在左移一次后,当新的操作数最高位与CF不相同时则OF置1,表明有符号数操作产生溢出,不再符合倍增关系;对无符号数,当移位后使CF置1,则不再符合倍增关系。例如:

AL=01000010B(66)/(+66)

左移一位为

AL=10000100B(132)/(-124);CF=0,OF=l

上例表明,对无符号数,移位后CF=0,故移位前后数间符合倍增关系(66×2=132);而对有符号数,移位后OF=1,所以移位前后数间不再符合倍增关系(+66×2≠-124)。

(2)逻辑右移指令SHR(SHiftlogicalRight)。

指令格式:SHROPRD,COUNT

OPRD为任一通用寄存器或存储器操作数。COUNT表示移位次数,移位一次,COUNT=1,移位多次,COUNT=CL(CL中为移位的次数)。

功能:对给定的目的操作数(8位/16位)右移COUNT次。最低位移入CF中,最高位补零。其操作示意如图4-19所示。图4-19逻辑右移指令操作示意例如:

移位1次 移位多次

SHR AL,1 MOV CL,3

SHR CX,1 SHR DX,CL

SHR ALFA[DI],1 SHR ALFA[DI],CL

说明:本指令影响标志位OF、PF、SF、ZF。CF决定移入的最低位。

同样,本指令主要用于右向移位操作,但右移一位,相当权值下降一级,所以本指令可作为无符号数的除2运算。请注意,在右移后,如果新的CF=1,表明移位前的数是一个奇数,则减半的结果是不精确的。

(3)算术左移指令SAL(SHiftArithmetiLeft)。

指令格式;SALOPRD,COUNT

OPRD为任一通用寄存器或存储器操作数。COUNT表示移位次数,移位一次,COUNT=1,移位多次,COUNT=CL(CL中为移位的次数)。

功能:对给定的目的操作数(8位/16位)左移COUNT次。最高位移入CF中,最低位补零。其操作示意图与图4-18一样。

说明:实际上SAL与SHL是同一指令的两种表示方法,具有完全相同的功能。它一般用来作为有符号数的倍增运算,在左移一次后,如果新的CF与新的操作数最高位不相同,则标志OF=1。表明移位前、后的操作数不再具有倍增关系。例如:

AL=11001101(-51)

左移位一次为

AL=10011010(-102);OF=0

左移位一次为

AL=00110100(+52);OF=1,不再符合有符号数的倍增关系

(4)算术右移指令SAR(SHiftArithmeticRight)。

指令格式:SAROPRD,COUNT

OPRD为任一通用寄存器或存储器操作数。COUNT表移位次数,移位一次,COUNT=1,移位多次,COUNT=CL(CL中为移位的次数)。图4-20算数右移指令操作示意

功能:对给定的目的操作数(8位/16位)右移COUNT次,最低位移入CF中,最高位保持不变。其操作示意如图4-20所示。图4-20算数右移指令操作示意例如:移位1次 移位多次

SAR AL,1 MOV CL,6

SAR BX,1 SAR BX,CL

SAR BETA[BX],1 SAR BETA[BX],CL

说明:本指令影响标志位PF、SF、ZF,CF决定移入的最低位。同样,本指令常用于有符号数的减半运算,但在右移使CF=1时,则会产生减半运算结果不精确的问题。例如:

AL=11001110B(-50)

右移一位为

AL=11100111B(-25);CF=0

右移一位为

AL=11110011B(-13);CF=1

2)循环移位指令

循环移位指令是指操作数进行首尾相连的移位操作,它共有4个指令,具有相似功能,一并说明如下。

指令格式:

ROL OPRD,COUNT;左向循环移位(RotareLeft)

ROR OPRD,COUNT;右向循环移位(RotareRight)

RCL OPRD,COUNT;带进位左向循环移位(RotateleftthroughCF)

RCR OPRD,COUNT;带进位右向循环移位(RotateRightthroughCF)

OPRD为任一通用寄存器或存储器操作数。COUNT表示移位次数,移位一次,COUNT=1,移位多次,COUNT=CL(CL中为移位的次数)。

功能:对给定的目的操作数(8位/16位)进行循环移位。ROL/ROR实现左向/右向不带CF的循环移位。RCL/RCR实现左向/右向带有CF的循环移位。它们的操作示意图如图4-21所示。

说明:本组指令只影响标志CF、OF。CF决定于移入位,OF决定于移位一次后符号位是否改变。如改变则OF=l,由于是循环移位,所以对字节只要移位8次(对字只要移位16次)就可以恢复为原操作数。而带CF的循环移位,因CF参加循环移位,所以可以利用它实现多字节的循环移位。图4-21循环移位指令操作示意图

【例4-7】在寄存器DX和AX中存放有32位二进制数(高位在DX中),要求实现乘4运算。

乘4运算可以通过对DX:AX左移两次,等价乘4的方法实现。先对低位AX逻辑左移一次,然后再对高位DX循环左移一次,通过CF完成寄存器间的移位。通过两次同样移位,就可实现乘4运算。相关指令如下:

SHL AX,1

RCL DX,1

SHL AX,1

RCL DX,1

对于多个存储单元,也可以使用同样方式完成移位操作。

5.转移指令

8086/8088系统中有4种类型转移指令:无条件转移、条件转移、重复控制和子程序调用。

1)无条件转移指令JMP(JUMP)

指令格式:JMPOPRD

OPRD为转移的目标地址。

功能:无条件地将控制转移到目标地址去。

说明:无条件转移可在段内进行,也可以在段间进行。寻址有直接和间接两种方式。本组指令对标志位无影响。具体表达无条件转移指令有下面几种方式:

(1)段内直接转移:JMPNEAR标号。

该标号具有NEAR属性,即段内指令的标号。汇编程序在汇编JMP指令时,将计算出JMP下一条指令与目标地址间的相对偏移量。当在 ±127字节之内时,产生一个短(SHORT)类型的JMP指令代码。否则产生一个在 ±32 KB范围内的(NEAR)JMP指令代码,由指令指针IP加上相对偏移量后,形成新的转移地址。

(2)段内间接转移:JMPOPRD。

OPRD为通用寄存器(16位)或存储器操作数。通用寄存器内容或存储器字内容给出目标地址(所在段内的偏移量),将指令指针IP换为该偏移量,形成新的转移地址。

例如:

JMP BX ;转向CS:BX

JMP RP ;转向SS:BP

JMP JNEAR「BX」 ;转向CS:(BX+JNEAR)

JMP WORDPTR[BX][DI]转向CS:(BX+DI)

JMPBX的段内间接转移操作示意图如图4-22所示图4-22段内间接转移示意图

(3)段间直接转移:JMPFAR标号。

该标号具有FAR属性,即段外指令标号。

汇编程序在汇编该JMP指令时,将生成2个字的操作数。第一个字为目标标号所在段的偏移量,将置换IP;第二个字为目标标号所在段的基地址,将置换CS,从而实现段间转移。也可以对外段中的NEAR标号实现段间转移,如:JMPFARPTRABC;ABC为外段的NEAR类型标号。

(4)段间间接转移:JMPDWORD。

DWORD为存储器双字操作数。段间间接转移,只能通过存储器操作数实现。在由它寻址的存储器双字中(在数据段中),放有目标地址偏移量和段基地址,由该存储器双字中的第1个字(即所在段的偏移量)置换IP,第2个字(即所在段的段基址)置换CS,从而实现段间转移。其操作示意图如图4-23所示。

2)条件转移指令

在8086/8088系统中,可根据比较或运算的结果(即标志位),形成多种条件转移指令。这组指令距离转向目标地址的相对偏移量必须在-128~+127字节之间。因此,它属于段内SHORT类型转移。当条件满足时,将相对偏移量加到指令指针IP上,可实现相对转移。

本组指令对标志位无影响。

条件转移指令只有一种格式:

条件转移指令助记符标号

为了说明方便,分为三种类型进行介绍。图4-23段间间接转移示意图

(1)根据标志位的条件转移指令。

①JC/JNC根据CF标志进行转移,JC有进位或借位,即CF=1时转移;JNC无进位或借位,即CF=0时转移。

②JE/JNC、JZ/JNZ根据ZF标志进行转移。JE∕JZ相等或结果为0,即ZF=1时转移;JNE/JNZ不相等或结果非0,即ZF=0时转移。

JE,JZ及JNE,JNZ均为一条指令的两种助记符表示方式。

③JS/JNS根据SF标志进行转移。JS结果为负,即SF=1时转移;JNS结果为正时,即SF=0时转移。④JO/JNO根据OF标志进行转移。JO溢出,即OF=1时转移;JNO无溢出,即OF=0时转移。

⑤JP/JNP,JPE/JPO根据PF标志进行转移。JP/JPE结果为偶,即PF=1时转移;JNP/JPO结果为奇,即PF=0时转移。

JP、JPE及JNP、JPO均为一条指令的两种助记符表示方式。

(2)用于无符号数的条件转移指令。

①JA/JNBE。JA/JNBE高于/不低于且不等于时转移,用于两个无符号数a,b比较时,a>b(即CF=0且ZF=0)时转移。两种助记符等价。

②JAE/JNB。JAE/JNB高于或等于/不低于时转移,用于两个无符号数a、b比较时,a≥b(即CF=0)时转移。两种助记符等价。

③JB/JNAE。JB/JNAE低于/不高于且不等于时转移,用于两个无

温馨提示

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

评论

0/150

提交评论