8086汇编指令-2118086汇编指令-211_第1页
8086汇编指令-2118086汇编指令-211_第2页
8086汇编指令-2118086汇编指令-211_第3页
8086汇编指令-2118086汇编指令-211_第4页
8086汇编指令-2118086汇编指令-211_第5页
已阅读5页,还剩206页未读 继续免费阅读

下载本文档

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

文档简介

第3章80X86指令系统及汇编语言3.1寻址方式3.2指令系统3.380386/80486指令系统

3.1寻址方式

3.1.1操作数的寻址方式

8086/8088指令中说明操作数所在地址的寻址方式有以下8种。

1.立即寻址立即寻址方式所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。图3.1立即寻址

2.直接寻址直接寻址是指操作数地址的16位段内偏移地址直接包含在指令中,它与操作码一起存放在代码段区域。操作数一般在数据段区域中,它的地址为数据段寄存器CS加上这16位的段内偏移地址。例:MOV

AX,DS:其过程如图3.2所示。指令中的16位段内偏移地址的低字节在前,高字节在后。图3.2直接寻址

3.寄存器寻址寄存器寻址是指操作数包含在CPU的内部寄存器中,例如AX、BX、CX、DX、SI、BP、AL、CH等。例:MOVDS,AX其过程如图3.3所示。寄存器可以是16位寄存器,也可以是8位寄存器。图3.3寄存器寻址

4.寄存器间接寻址在寄存器间接寻址方式中,操作数存放在存贮器中,操作数的16位段内偏移地址放在SI、DI、BP、BX这4个寄存器中之一。由于上述4个寄存器所默认的段寄存器不同,这样又可以分成两种情况:①若以SI、DI、BX进行间接寻址,则操作数通常存放在现行数据段中。②若以寄存器BP间接寻址,则操作数存放在堆栈段区域中。例:MOVAX,[SI]其过程如图3.4(a)所示。例:MOVAX,[BP]其过程如图3.4(b)所示。图3.4寄存器间接寻址

5.寄存器相对寻址在寄存器相对寻址方式中,操作数存放在存贮器中。操作数的地址是由段寄存器内容加上SI、DI、BX、BP之一的内容,再加上由指令中所指出的8位或16位相对地址偏移量而得到的。在一般情况下,若用SI、DI或BX进行相对寻址时,以数据段寄存器DS作为地址基准,而用BP寻址时,则以堆栈段寄存器作为地址基准。例:MOVAX,DISP[SI]其过程如图3.5所示。图3.5寄存器相对寻址

6.基址、变址寻址在8086/8088中,通常把BX和BP作为基址寄存器,而把SI、DI作为变址寄存器。将这两种寄存器联合起来进行的寻址就称为基址、变址寻址。这时,操作数的地址应该是段寄存器内容加上基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的。同理,若用BX作为基地址,则操作数应放在数据段DS区域中;若用BP作为基地址,则操作数应放在堆栈段SS区域中。例:MOVAX,[BX][S1]其过程如图3.6所示。

7.基址、变址、相对寻址基址、变址、相对寻址方式实际上是第6种寻址方式的扩充。即操作数的地址是由基址、变址方式得到的地址再加上由指令指明的8位或16位的相对偏移地址而得到的。例:MOVAX,DISP[BX][S1]其过程如图3.7所示。图3.6基址、变址寻址图3.7基址、变址、相对寻址

8.隐含寻址在有些指令的指令码中,不仅包含有操作码信息,而且还隐含了操作数地址的信息。例如乘法指令MUL的指令码中只需指明一个乘数的地址,另一个乘数和积的地址是隐含固定的。这种将操作数的地址隐含在指令操作码中的寻址方式称为隐含寻址。

3.1.2转移地址的寻址方式

1.段内相对寻址在段内相对寻址方式中,指令应指明一个8位或16位的相对地址位移量DISP(有正负符号,用补码表示)。此时,转移地址应该是代码段寄存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP。例:JMPDISP1

其过程如图3.8所示。图3.8段内相对寻址

2.段内间接寻址在段内间接寻址方式中,转移地址的段内偏移地址要么存放在一个16位的寄存器中,要么存放在存贮器的两个相邻单元中。存放偏移地址的寄存器和存贮器的地址将按指令码中规定的寻址方式给出。此时,寻址所得到的不是操作数,而是转移地址。例:JMPCX

其过程如图3.9所示。图3.9段内间接寻址

3.段间直接寻址在段间直接寻址方式中,指令码中将直接给出16位的段地址和16位的段内偏移地址。例:JMPFARPTRADD1

在执行这条段间直接寻址指令时,指令操作码后的第二个字将赋予代码段寄存器CS,第一个字将赋予指令指针寄存器IP。最后CS内容和IP内容相加则得转移地址,如图3.10所示。图3.10段间直接寻址

4.段间间接寻址段间间接寻址方式和段内间接寻址相似。但是,由于确定转移地址需要32位信息,因此段间间接寻址只适用于存贮器寻址方式。用这种寻址方式可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址,而后两单元存放的是16位的段地址,如图3.11所示。例:JMPDWORDPTR[BP][DI]图3.11段间间接寻址

3.2指令系统

8086/8088的指令系统大致可分为7种类型:·数据传送指令·算数运算指令·逻辑运算和移位指令·串操作指令·程序控制指令·处理器控制指令·输入/输出指令

3.2.1数据传送指令

1.MOV指令

MOVOPRD1,OPRD2

目的源

MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器。数据传送方向的示意图如图3.12所示。图3.12MOV的数据传送方向各种数据传送指令例举如下:①在CPU各内部寄存器之间传送数据。

MOVAL,BL;8位数据传送指令(1个字节)MOVAX,DX;16位数据传送指令(1个字)MOVSI,BP;16位数据传送指令(1个字)②立即数传送至CPU的通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI)。

MOVCL,4 ;8位数据传送(1个字节)MOVAX,03FFH ;16位数据传送(1个字)③CPU内部寄存器(除了CS和IP以外)与存贮器(所有寻址方式)之间的数据传送,可以传送一个字节也可以传送一个字。

·在CPU的通用寄存器与存贮器之间传送数据:

MOVAL,BUFFERMOV[DI],CX·在CPU寄存器与存贮器之间传送数据:

MOVDS,DATA[SI+BX]

MOVDEST[BP+D1],ES

使用中需要注意的是:①MOV指令不能在两个存贮器单元之间进行数据直接传送。②MOV指令不能在两个段寄存器之间进行数据直接传送。③立即数不能直接传送给段寄存器。④目的操作数不能为CS、IP。

其中,①~③的传送可用通用寄存器作为中介,用两条传送指令完成。例如,为了将在同一个段内的偏移地址为AREA1的数据传送到偏移地址为AREA2单元中去,可执行以下两条传送指令:

MOVAL,AREA1MOVAREA2,AL

例如,为了将立即数传送给DS,可执行以下两条传送指令:

MOVAX,1000HMOVDS,AX例如,将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。程序如下:

MOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100AGAIN:MOVAL,[SI]MOV[D1],ALINCSIINCDIDECCXJNZAGAIN

2.交换指令

XCHGOPRD1,OPRD2

交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之间进行,但是段寄存器不能作为一个操作数。例如:

XCHGAL,CLXCHGAX,DIXCHGBX,SIXCHGAX,BUFFERXCHGBX,DATA[SI]

3.地址传送指令

8086/8088有3条地址传送指令。

(1)LEA指令

LEAOPRD1,OPRD2

该指令把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1中。

(2)LDS指令该指令完成一个地址指针的传送。

(3)LES指令这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。

4.堆栈操作指令堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定。堆栈操作具有先入后出的特点。用于堆栈操作的指令主要是:

PUSHOPRD(堆栈压入指令)POPOPRD(堆栈弹出指令)

堆栈操作指令中的操作数可以是段寄存器(除CS)的内容、16位的通用寄存器(标志寄存器有专门的出入栈指令)以及内存的16位字。例如:MOVAX,8000HMOVSS,AXMOVSP,2000HMOVDX,3E4AHPUSHDXPUSHAX当执行完两条压入堆栈的指令时,堆栈中的内容如图3.13所示。压入堆栈指令PUSHDX的执行过程为:①SP-1→SP;②DH→(SP);③SP-1→SP;④DL→(SP)。弹出堆栈指令POPAX的过程与此刚好相反:①(SP)→AL;②SP+1→SP;③(SP)→AH;④SP+1→SP。图3.13堆栈操作示意图

5.字节、字转换指令

CBWCWDCBW指令将AL的符号位(bit7)扩展到整个AH中,即将字节转换成一个字。例如:

MOVAL,4FHCBW

执行后,AX=004FH。

CWD指令将AX的符号位(bit15)扩展到整个DX,即将字转换成双字。例如:

MOVAX,834EHCWD

执行后,DX=FFFFH,DXAX=FFFF834EH。

3.2.2算术运算指令

8086/8088可提供加、减、乘、除4种基本算术运算的操作指令。这些指令可实现字节或字的运算,也可以用于符号数和无符号数的运算。

1.加法指令

(1)ADDOPRD1,OPRD2

这条指令完成两个操作数相加,结果送至目的操作数OPRD1,即:

OPRD1←OPRD1+OPRD2具体地说,该指令可以实现累加器与立即数、累加器与任一通用寄存器、累加器与存贮单元内容相加,其和放回累加器中。例如:

ADDAL,30ADDAX,3000HADDAX,SIADDAL,DATA[BX]该指令也可以实现任一通用寄存器与立即数、累加器或别的寄存器、存贮单元的内容相加,其和放回寄存器中。例如:

ADDBX,3FFHADDSI,AXADDDI,CXADDDX,DATA[BX+SI]该指令还可以实现存贮器操作数与立即数、累加器或别的寄存器的内容相加,其和放回存贮单元中。例如:

ADDBETA[SI],100ADDBETA[SI],AXADDBETA[SI],DX

这些指令执行时,对标志位CF、OF、PF、SF、ZF和AF都会产生影响。

(2)ADC指令这条指令与ADD指令基本相同,只是相加时再加上进位位的当前值,即:

OPRD1←OPRD1+OPRD2+CFMOVAX,FIRSTADDAX,SECONDMOVTHIRD,AXMOVAX,FIRST+2ADCAX,SECOND+2MOVTHIRD+2,AX

(3)INCOPRD指令这条指令对指定的操作数进行加1操作,其操作数可以是通用寄存器,也可以在内存单元中。加1操作时,把操作数看作为无符号的二进制数。

INC指令常用于在循环程序中修改地址指针和循环次数等。例如:

INCALINC[SI]

2.减法指令

(1)SUBOPRD1,OPRD2

该指令进行两个操作数的相减操作,即:

OPRD1←OPRD1-OPRD2(2)SBB指令该指令与SUB相类似,只是相减时,还应减去借位标志CF的当前值,即:

OPRD1←OPRD1-OPRD2-CF

(3)DECOPRD指令该指令实现对操作数的减1操作,所用的操作数可以是通用寄存器,也可以在内存单元中。减1操作时,把操作数看作为无符号的二进制数。例如:

DECBXDEC[DI]

4)NEGOPRD

该指令用来对操作数进行求补操作,即对操作数按位取反后加1。例如:

NEGALNEGMULRE

(5)CMPOPRD1,OPRD2

该指令为比较指令,与减法指令一样执行OPRD1-OPRD2操作,但相减后不回送结果,只是根据相减结果修改标志位。即:

OPRD1-OPRD2

比较指令可以用于累加器与立即数,累加器与任一通用寄存器或任一内存操作数之间的比较。例如:

CMPAL,100CMPAX,SICMPAX,DATA[BX]该指令也可以用于任一寄存器与立即数或别的寄存器及任一内存操作数之间的比较,例如:

CMPBX,04FEHCMPDX,DICMPCX,COUNT[BP]该指令还可以用于内存操作数与立即数及任一寄存器中操作数之间的比较。例如:

CMPDATA,100CMPCOUNT[SI],AXCMPPOINTER[DI],BX综上所述,可以归纳出如下结论:当没有溢出时(OF=0),若SF=0,则AX>BX;若SF=1,则AX<BX。当产生溢出时(OF=1),若SF=0,则AX<BX;若SF=1,则AX>BX。用逻辑表达式又可简化为:若OFSF=0,则AX≥BX;

若OFSF=1,则AX<BX。例如,若自BLOCK开始的内存缓冲区中,有100个带符号的数,希望找到其中最大的一个值,并将它放到MAX单元中。

MOVBX,OFFSETBLOCKMOVAX,[BX]

INCBXINCBXMOVCX,99AGAIN:CMPAX,[BX]

JGNEXTMOVAX,[BX]NEXT:INCBXINCBXDECCXJNEAGAINMOVMAX,AXHLT

3.乘法指令乘法指令分为无符号数乘法指令和带符号数乘法指令两种。

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

该指令的一般格式为:

MULOPRD;OPRD为源操作数例:字节乘以字节

MOVAL,LSRCBYTE;被乘数送ALMULRSRCBYTE;结果存于AX中字乘以字

MOVAX,LSRCWORD;一个字送AXMULRSRCWORD;结果的高字节在DX中,低字节在AX中字节乘以字

MOVAL,MULBYTE;字节被乘数送入ALCBW;AL中字节转换成AX中的字

MULRSRCWORD

(2)带符号数乘法指令IMUL

这是一条带符号数的乘法指令,它和MUL一样可以进行字节和字节、字和字的乘法运算。结果放在AX或DX、AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。该指令的一般格式为:

IMULOPRD

例:字节乘以字节

MOVAL,LSRC_BYTE;被乘数送ALIMULRSRC_BYTE

4.除法指令

8088有两条除法指令:无符号除法指令和带符号除法指令。

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

执行该指令,如果结果大于寄存器可以保存的值时,则产生0型中断。例:字除以字节

MOVAX,NUMERATORWORD;被除数送AXDIVDIVISORBYTE;商在AL中,余数在AH中

字节除以字节

MOVAL,NUMERATORBYTE;被除数送A1CBW;AL中的字节扩展成AX中的字

DIVDIVISORBYTE

字除以字

MOVAX,NUMERATORWORDCWD;把字转换成双字DX、AXDIVDIVISORWORD;商在AX中,余数在DX中

(2)带符号除法指令IDIV

该指令是带符号的除法指令。执行除法后,余数符号与被除数相同,其他同DIV指令。

IDIV指令一般格式为:

IDIVOPRD

例:双倍字长除以字

MOVDX,NUMHIWORD;被除数高位字送DXMOVAX,NUMLOWORD;被除数低位字送AXIDIVDIVISORWORD[SI]

5.调整指令

8088的调整指令主要用于十进制数的调整。

AAA——对AL中ASCII未压缩的十进制和进行调整;

AAS——对AL中ASCII未压缩的十进制差进行调整;

AAD——在除法指令前对AX中ASCII未压缩的十进制数进行调整;

AAM——对AX中两个ASCII未压缩十进制相乘结果进行调整;

DAA——对AL中的两个压缩十进制数相加之和进行调整,得到压缩十进制和;

DAS——对AL中的两个压缩十进制数相减之差进行调整,得到压缩十进制差。

3.2.3逻辑运算和移位指令逻辑运算和移位指令包括逻辑运算、移位和循环移位指令。

1.逻辑运算指令

(1)NOTOPRD

该指令对操作数进行求反操作,然后将结果送回。操作数可以是寄存器或存贮器的内容。该指令对标志位不产生影响。例如:

NOTAL

(2)AND指令该指令对两个操作数进行按位相“与”的逻辑运算。即只有参加相与的两位全为“1”时,相“与”结果才为“1”;否则相“与”结果为“0”。相“与”结果送回。AND指令可以进行字节操作,也可以进行字操作。

AND指令的一般格式为:

ANDOPRD1,OPRD2例如:ANDAL,0FHANDAX,BXANDSI,BPANDAX,DATA#--WORDANDDX,BUFFER[SI+BX]ANDDATA#--WORD,00FFHANDBLOCK[BP+DI],DX

(3)TEST指令该指令的操作功能与AND指令相同,其结果将反映在标志位上,但结果不送回,即TEST指令将不改变操作数的值。这条指令通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态。

TEST指令的一般格式为:

TESTOPRD,im

;im是立即数立即数中哪一位为1,表示要对哪一位进行测试。例如,若要检测AL中的最低位是否为1,且若为1则转移。在这种情况下可以用如下指令:

TESTAL,01HJNZTHERE…THERE:MOVBL,05H…

(4)OR指令该指令对两个操作数进行按位相“或”的逻辑操作,即进行相“或”的两位中的任一位如果为1时,则相“或”的结果为1;如果两位都为0时,其结果才为0。OR指令操作结果将送回。OR指令允许对字节或对字进行相“或”运算。

OR指令使标志位CF=0,OF=0;相“或”操作的结果反映在标志位PF、SF和ZF上;对AF标志位未定义。

OR指令的一般格式为:

OROPRD1,OPRD2例如:ORAL,30HORAX,00FFHORBX,SIORBX,DATAWORDORBUFFER[BX],SIORBUFFER[BX+SI],8000H

(5)XOR指令该指令对两个操作数进行按位“异或”操作,即进行“异或”操作的两位值不同时,其结果为“1”;否则就为0,操作结果送回。

XOR指令的一般形式为:

XOROPRD1,OPRD2例如:XORAL,0FHXORAX,BXXORDX,SIXORCX,CONNTWORDXORBUFFER[BX],DIXORBUFFER[BX+SI],AX

2.移位指令

8088有3条移位指令:算术左移和逻辑左移指令SAL/SHLOPRD,m

算术右移指令SAROPRD,m

逻辑右移指令SHROPRD,m(1)SAL/SHL指令这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入标志位CF,如图3.14(a)所示。图3.14移位指令示意图

(a)SAL/SHL;(b)SAR;(c)SHR

(2)SAR指令该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.14(b)所示。

SAR指令影响标志位CF、OF、PF、SF和ZF。右移一位相当于除以2,例如:

MOVAL,16SARAL,1 ;执行后,AL的内容为8(相当于 除以2)

(3)SHR指令该指令每执行一次移位操作,就使操作数右移一位,最低位移至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.14(c)所示。该指令可以执行由m所指定的移位次数。

3.循环移位指令

8088有4条循环移位指令:左循环移位指令ROLOPRD,m

右循环移位指令ROROPRD,m

带进位左循环移位指令RCLOPRD,m

带进位右循环移位指令RCROPRD,m(1)ROL指令该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.15(a)所示。图3.15循环移位指令示意图

(a)ROL;(b)ROR;(c)RCL;(d)RCR

(2)ROR指令该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.15(b)所示。当规定的循环次数为1时,若循环移位后,操作数的最高位和次高位不相等,则标志位CF=1;否则OF=0。这可以用来判别移位前后操作数的符号是否有改变。该指令只影响CF和OF标志位。(3)RCL指令该指令是把标志位CF包含在内的循环左移指令。(4)RCR指令该指令是把进位标志位CF包含在内的右循环指令。

3.2.4串操作指令

1.MOVS/MOVSB/MOVSW

该类指令是串传送指令,用于内存区之间字节串或字串的传送。串传送指令的一般格式为:

MOVSOPRD1,OPRD2;OPRD2是源串, OPRD1是目的串

MOVSB;字节传送

MOVSW;字传送

2.CMPS/CMPSB/CMPSW

该类指令是串比较指令,常用于内存区之间的数据、字符等的比较。串比较指令的一般格式为

CMPSOPRD1,OPRD2 ;OPRD1是源串, OPRD2是目的串

CMPSB;字节比较

CMPSW;字比较

3.SCAS/SCASB/SCASW

该类指令是串扫描指令,用于寻找内存区中指定的数据和字符。串扫描指令的一般格式为

SCAS

OPRD;OPRD是目的串

SCASB;字节操作

SCASW;字操作4.LODS/LODSB/LODSW该类指令是串装入指令。串装入指令的一般格式为:

LODS

OPRD;OPRD为源串

LODSB;字节操作

LODSW;字操作5.STOS/STOSB/STOSW该类指令是字串存贮指令。串存贮指令的一般格式为:

STOSOPRD;OPRD为目的串

STOSB;字节操作

STOSW;字操作

6.REPREP是串指令的前缀。当某一条串指令需要多次重复时,就可以加上该前缀。重复次数由CX决定,每重复执行一次,CX内容减1,直到CX=0为止。

7.REPE/REPNE

它们是条件重复前缀。当条件满足时,才重复执行后面的串指令,一旦条件不满足,重复就停止。

REPE指令是相等重复指令,当ZF=1且CX未减到0,串指令重复执行。

REPNE指令是不相等重复指令,当ZF=0且CX未减到0,串指令重复执行。

例:数据段中地址BUFFER1开始的字符串,长度为1000字节,将其传送到附加段中地址BUFFER2开始的数据区。

MOVSI,OFFSETBUFFER1;BUFFER1偏移地址 送SIMOVDI,OFFSETBUFFER2;BUFFER2偏移地址 送DIMOVCX,1000;传送次数送CXCLD;使DF=0,SI、DI做加1操作

REPMOVSB;串传送例:若上例中的BUFFER1和BUFFER2都处于数据段,则程序可修改如下:

MOVAX,DSMOVES,AX;使ES=DSLEASI,BLOCK1;源串地址送SILEADI,BLOCK2;目的串地址送DIMOVCX,500;重复次数送CXCLD ;使DF=0,SI、DI做加2操作

REPEMOVSW;串传送例:比较数据段中源串SOURCE和附加段中目的串DEST中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。

LEADI,ES:DESTLEASI,SOURCEMOVCX,500CLDREPECMPBJZNEXTMATCH:DECSIMOVAL,BYTEPTR[SI]

NEXT:…

3.2.5程序控制指令程序控制指令主要是指程序转移指令。转移类指令通过改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。

1.无条件转移、调用和返回指令这些指令都将引起程序执行顺序的改变。转移有段内转移和段间转移之分。所谓段内转移是指段地址不变,仅IP发生改变;而段间转移时,CS和IP均发生改变。

(1)无条件转移指令JMP

该指令分直接转移和间接转移两种。直接转移又可分短程(SHORT)、近程(NEAR)和远程(FAR)3种形式。当程序执行到JMP指令时,就无条件地转移到指令中所指示的目的地址。该指令的一般格式为JMPOPRD;OPRD是转移的目的地址直接转移的3种形式为:

·短程转移JMPSHORTOPRD

短程转移中目的地址与JMP指令所处地址的距离应在-128~+127范围之内。

·近程转移JMPNEARPTROPRD

或JMPOPRD;NEAR可省略

·远程转移JMPFARPTROPRD

远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。间接转移指令的目的地址可以由存贮器或寄存器给出:

·段内间接转移JMPWORDPTROPRD·段间间接转移JMPDWORDPTROPRD

(2)调用和返回指令

CALL指令用来调用一个过程,在过程执行完后可使用返回指令RET,使程序返回调用程序继续执行。由于过程有段间(即远程FAR)和段内调用(即近程NEAR)之分,所以CALL也有FAR和NEAR之分,RET也分段间和段内返回两种。这由被调用过程的定义所决定。调用指令一般格式为:

CALLNEARPTROPRD;段内调用

CALLFARPTROPRD;段间调用例:近程调用

;主程序(近程调用)

…CALLNEARPTRPROAD…

;过程PROAD定义

PROADPROCNEARPUSHAXPUSHCXPUSHSILEASI,ARY

MOVCX,COUNTXORAX,AXNEXT:ADDAX,[SI]

ADDSI,2LOOPNEXTMOVSUM,AXPOPSIPOPCXPOPAXRETPROADENDP例:远程调用;主程序(远程调用)…CALLFARPTRPROADD…

;过程PROADD定义(远程调用过程)PROADDPROCFARPUSHAXPUSHCXPUSHSIPUSHDIMOVSI,[BX]MOVDI,[BX+2]MOVCX,[DI]MOVDI,[BX+4]XORAX,AXNEXT1:ADDAX,[SI]ADDSI,2LOOPNEXT1MOV[DI],AXPOPDIPOPSIPOPCXPOPAXRETPROADDENDP

2.条件转移指令条件转移指令将上一条指令所设置的某些标志位的状态作为测试条件,条件满足则转向指令中所指示的目的地址。(1)以单个标志位为条件

JOOPRD;溢出转移

JNOOPRD;不溢出转移

JSOPRD;结果为负转移

JNSOPRD;结果为正转移

JCOPRD;进位转移

JNCOPRD;无进位则转移

JE/JZOPRD;等于或为零转移(2)无符号数比较JA/JNBEOPRD;高于或不低于等于转移JAE/JNBOPRD;高于等于或不低于转移JB/JNAEOPRD;低于或不高于等于转移JBE/JNAOPRD;低于等于或不高于转移(3)带符号数比较JG/JNLEOPRD;大于或不小于等于转移JGE/JNLOPRD;大于等于或不小于转移JL/JNGEOPRD;小于或不大于等于转移JLE/JNGOPRD;小于等于或不大于转移

3.循环控制指令该类指令的一般格式为:

LOOPOPRD;CX=0循环

LOOPEOPRD;CX=0且ZF=1循环

LOOPNEOPRD;CX=0且ZF=0循环在LOOPE和LOOPNE两条指令中,只要两个条件中任一个不满足,循环就结束。例:

SUBDI,BXINCDIMOVCX,DIDECBXNEXT:INCBXCMPBYTEPTR[BX],0LOOPENEXT

4.软中断指令及中断返回指令当程序执行到中断指令INT时,便中断当前程序的执行,转向由256个中断向量所提供的中断入口地址之一去执行。软中断指令的一般格式为:

INTOPRD;OPRD可以取00H~FFH中的值

3.2.6处理器控制指令该类指令用来控制处理器与协处理器之间的交互作用,修改标志寄存器,以及使处理器与外部设备同步等。

1.标志位操作指令

STC;使CF=1CLC;使CF=0CMC;使CF取反

STD;使DF=1CLD;使DF=0STI;使IF=1CLI;使IF=02.外部同步指令(1)暂停指令HLT(2)空操作指令NOP(3)等待指令WAIT(4)封锁总线指令LOCK(5)处理器交权指令ESC3.2.7输入输出指令输入指令的一般格式为:

INACC,PORT

它完成从接口到CPU的输入操作。输出指令的一般格式为:

OUTPORT,ACC

它完成从CPU到接口的输出操作。

1.直接寻址输入输出指令中直接给出一个字节表示的接口地址。由于接口地址用一个字节表示,故可寻址的接口地址只有256个(00H到FFH)。例如:

INAL,35HOUT44H,AX

2.寄存器间接寻址输入输出指令中接口地址由DX的内容来决定。由于DX是16位的寄存器,故可寻址的接口地址为64K个(0000H到FFFFH)。例如:

MOVDX,03F8HINAL,DX

表示由接口地址03F8H输入一个字节到AL。

3.380386/80486指令系统

3.3.180386的寻址方式

80386的寻址方式分为三大类。

(1)寄存器寻址方式在这种寻址方式,操作数放在32位、16位或8位的通用寄存器中。

(2)立即数方式操作数以立即数形式出现在指令中。

(3)存贮器寻址方式按照80386系统的存贮器组织方式,逻辑地址由选择子和偏移量组成。偏移量也称为有效地址,由4个分量计算得到:

·基址:任何通用寄存器都可作为基址寄存器,其内容即为基址。

·位移量:在指令操作码后面的32位、16位或8位的数。

·变址:除了ESP寄存器外,任何通用寄存器都可以作为变址寄存器,其内容即为变址值。

·比例因子:变址寄存器的值可以乘以一个比例因子,根据操作数的长度可为1字节、2字节、4字节或8字节,比例因子相应地可为1,2,4或8。由上面4个分量计算有效地址的方法为:

EA=基址+变址×比例因子+位移量图3.16表示了这种寻址计算方法。

图3.1680386寻址计算方法按照4个分量组合有效地址的不同方法,可以有下述9种存贮器寻址方式。

(1)直接寻址方式位移量就是操作数的有效地址,此位移量包含在指令中。例:INCWORDPTR[500][WB];字的有效地址为500(2)寄存器间接寻址方式操作数的有效地址即基址寄存器的内容。例:MOV[ECX],EDX;ECX指出有效地址

(3)基址寻址方式基址寄存器的内容和位移量相加形成有效地址。例:MOVECX,[EAX+24];由EAX中内容 加24组成有效地址

(4)变址寻址方式变址寄存器的内容和位移量相加形成有效地址。例:ADDEAX,[ESI],5;ESI的内容加5组成有效地址

(5)带比例因子的变址寻址方式变址寄存器的内容乘以比例因子,再加位移量得到有效地址。例:IMULEBX,[ESI×4],7;ESI的内容乘以4再加7形成有效地址

(6)基址变址寻址方式基址寄存器的内容加变址寄存器的内容组成有效地址。例:MOVEAX,[ESI][EBX];EBX的内容加ESI的内容即有效地址

(7)基址加比例因子变址寻址方式变址寄存器的内容乘以比例因子,再加上基址寄存器的内容作为有效地址。例:MOVECX,[EDI×8][EAX];EDI内容乘以8再加EAX内容即为有效地址

(8)带位移量的基址变址寻址方式基址寄存器的内容加变址寄存器的内容,再加位移量形成有效地址。例:ADDEDX,[ESI][EBP+100H];ESI的内容加EBP的内容再加100H;即为有效地址

(9)带位移量的基址比例因子变址方式变址寄存器的内容乘以比例因子,再加上基址寄存器的内容,又加上位移量,形成有效地址。例:MOVEAX,[EDI×4][EBP+80];EDI的内容乘4,加EBP的内容,;再加80即有效地址

3.3.2386/486改进的指令

1.MOV指令

32位的源操作数传送到32位的目的中,目的与源均可为通用寄存器或存贮器,但不能同时为存贮器,源还可以为32位的立即数。例:

MOVEAX,EBXMOVDWORDPTR[EBX],345678H

2.堆栈指令(1)PUSH、POP指令

PUSH指令将32位的通用寄存器、存贮器或立即数压入堆栈;POP指令则将堆栈指针指示的两个存贮字弹出给32位的通用寄存器或32位的存贮器。例:

PUSHEAXPUSH12345678HPOPEBXPOPDWORDPTR

另外,8086/8088执行PUSHSP指令是将SP减2后的值进栈,而80286/80386执行PUSHSP(或PUSHESP)指令时,是将执行本指令之前的SP(或ESP)进栈。

(2)立即数压栈指令格式:PUSHnnnn

功能:将字立即数nnnn推进堆栈。

(3)通用寄存器压栈、弹栈格式:PUSHA

功能:将8个寄存器的内容按照AX、CX、DX、BX、SP、BP、SI、DI的先后顺序压入堆栈。格式:POPA

功能:将堆栈顶起始的8个存贮字按顺序弹出给DI、SI、BP、SP、BX、DX、CX、AX共8个通用寄存器。

3.XCHG指令

32位的源操作数与32位的目的操作数相互交换,目的与源均可为通用寄存器或存贮器,但不能同时为存贮器。

4.加法和减法指令目的与源均可为32位的通用寄存器或存贮器,但不能同时为存贮器,源还可以为32位的立即数。例:

ADDEAX,EBXADCECX,DWORDPTR[3888H]

SUBEDX,[EAX]

SBBECX,123456H

5.无符号乘法指令源为32位的通用寄存器或存贮器,隐含在EAX中的被乘数乘以32位的源操作数产生64位的积,即EAX×源→EDX:EAX。例:MULESI;EAX*ESI→EDX:EAX

6.除法指令源为32位的通用寄存器或存贮器,隐含在EDX:EAX中的64位的被除数除以32位的源操作数,产生32位的商存入EAX中,余数存入EDX中。例:

DIVEBX;EDX:EAX/EBX,商→EAX,余数→EDXIDIVECX;EDX:EAX/ECX,商→EAX,余数→EDX

7.有符号乘法指令格式1:IMUL源本指令与MUL指令的功能完全相同,但IMUL指令隐含的一个操作数与源操作数以及结果均为有符号数(补码形式)。如果结果的高半部分(在EDX中)仅仅是低一半的符号的扩展,则CF=OF=0,否则CF=OF=1。格式2:IMUL目的,源格式3:IMUL目的,源1,源2

格式2、3与格式1是同一类型指令,但取乘积的长度不同。例:IMULEDX,EBX;EDX×EBX→EDXIMULEBX,4000H;EBX×4000H→EBXIMULECX,EAX,88H;EAX×88H→ECXIMULEDX,DWORDPTR[EBX],3456H;[EBX]×3456H→EDX8.INC、DEC指令操作数可为32位的通用寄存器或存贮器。例:

INCEDIDECDWORDPTR[EBX+EAX×4]9.比较指令例:

CMPEAX,ESI;EAX-ESICMPEDX,[EBX+1000H]

10.逻辑运算指令目的与源均可扩充为32位的通用寄存器或存贮器,但不得同时为存贮器,源操作数还可为32位的立即数。例:

ANDEAX,BCXORECX,[EBX]

XORESI,ESINOTEDXTESTDWORDPTR[1000H],80H

11.移位指令目的可扩充为32位的通用寄存器或存贮器,源可为任一8位的立即数或CL寄存器。例:

SHLECX,3SHREAX,CLSALDWORDPTR[EBX],CLSARDWORDPTR[EBX+EAX×4],20H

12.串指令

DS:ESI源串,ES:EDI目的串的相应功能的双字操作,ESI和EDI加4或减4,ECX寄存器为计数器。

13.串输入指令格式1:[REP]INS目的串,DX

格式2:[REP]INSB

[REP]INSW

[REP]INSD例:

INSM--WORD,DXINSBREPINSBINSW

例:

温馨提示

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

评论

0/150

提交评论