【教学课件】第3章80X86指令系统及汇编语言.ppt

上传人:牧羊曲112 文档编号:5658488 上传时间:2023-08-06 格式:PPT 页数:211 大小:678.50KB
返回 下载 相关 举报
【教学课件】第3章80X86指令系统及汇编语言.ppt_第1页
第1页 / 共211页
【教学课件】第3章80X86指令系统及汇编语言.ppt_第2页
第2页 / 共211页
【教学课件】第3章80X86指令系统及汇编语言.ppt_第3页
第3页 / 共211页
【教学课件】第3章80X86指令系统及汇编语言.ppt_第4页
第4页 / 共211页
【教学课件】第3章80X86指令系统及汇编语言.ppt_第5页
第5页 / 共211页
点击查看更多>>
资源描述

《【教学课件】第3章80X86指令系统及汇编语言.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第3章80X86指令系统及汇编语言.ppt(211页珍藏版)》请在三一办公上搜索。

1、第3章 80X86指令系统及汇编语言,3.1 寻址方式3.2 指令系统3.3 80386/80486指令系统,3.1 寻址方式,3.1.1 操作数的寻址方式 8086/8088指令中说明操作数所在地址的寻址方式有以下8种。1.立即寻址 立即寻址方式所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。,图3.1 立即寻址,2.直接寻址 直接寻址是指操作数地址的16位段内偏移地址直接包含在指令中,它与操作码一起存放在代码段区域。操作数一般在数据段区域中,它的地址为数据段寄存器CS加上这16位的段内偏移地址。例:MOVAX,DS:其过程如图3.2所示。指令中的16位段

2、内偏移地址的低字节在前,高字节在后。,图3.2 直接寻址,3.寄存器寻址 寄存器寻址是指操作数包含在CPU的内部寄存器中,例如AX、BX、CX、DX、SI、BP、AL、CH等。例:MOV DS,AX 其过程如图3.3所示。寄存器可以是16位寄存器,也可以是8位寄存器。,图3.3 寄存器寻址,4.寄存器间接寻址 在寄存器间接寻址方式中,操作数存放在存贮器中,操作数的16位段内偏移地址放在SI、DI、BP、BX这4个寄存器中之一。由于上述4个寄存器所默认的段寄存器不同,这样又可以分成两种情况:若以SI、DI、BX进行间接寻址,则操作数通常存放在现行数据段中。若以寄存器BP间接寻址,则操作数存放在堆

3、栈段区域中。,例:MOV AX,SI其过程如图3.4(a)所示。例:MOV AX,BP其过程如图3.4(b)所示。,图3.4 寄存器间接寻址,5.寄存器相对寻址 在寄存器相对寻址方式中,操作数存放在存贮器中。操作数的地址是由段寄存器内容加上SI、DI、BX、BP之一的内容,再加上由指令中所指出的8位或16位相对地址偏移量而得到的。在一般情况下,若用SI、DI或BX进行相对寻址时,以数据段寄存器DS作为地址基准,而用BP寻址时,则以堆栈段寄存器作为地址基准。例:MOV AX,DISPSI 其过程如图3.5所示。,图3.5 寄存器相对寻址,6.基址、变址寻址 在8086/8088中,通常把BX和B

4、P作为基址寄存器,而把SI、DI作为变址寄存器。将这两种寄存器联合起来进行的寻址就称为基址、变址寻址。这时,操作数的地址应该是段寄存器内容加上基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的。同理,若用BX作为基地址,则操作数应放在数据段DS区域中;若用BP作为基地址,则操作数应放在堆栈段SS区域中。例:MOV AX,BXS1 其过程如图3.6所示。,7.基址、变址、相对寻址 基址、变址、相对寻址方式实际上是第6种寻址方式的扩充。即操作数的地址是由基址、变址方式得到的地址再加上由指令指明的8位或16位的相对偏移地址而得到的。例:MOV AX,DISPBXS1 其

5、过程如图3.7所示。,图3.6 基址、变址寻址,图3.7 基址、变址、相对寻址,8.隐含寻址 在有些指令的指令码中,不仅包含有操作码信息,而且还隐含了操作数地址的信息。例如乘法指令MUL的指令码中只需指明一个乘数的地址,另一个乘数和积的地址是隐含固定的。这种将操作数的地址隐含在指令操作码中的寻址方式称为隐含寻址。,转移地址的寻址方式 1段内相对寻址 在段内相对寻址方式中,指令应指明一个8位或16位的相对地址位移量DISP(有正负符号,用补码表示)。此时,转移地址应该是代码段寄存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP。例:JMP DISP1 其过程如图3.8所示。,图3.8

6、 段内相对寻址,2段内间接寻址 在段内间接寻址方式中,转移地址的段内偏移地址要么存放在一个16位的寄存器中,要么存放在存贮器的两个相邻单元中。存放偏移地址的寄存器和存贮器的地址将按指令码中规定的寻址方式给出。此时,寻址所得到的不是操作数,而是转移地址。例:JMP CX 其过程如图3.9所示。,图3.9 段内间接寻址,3段间直接寻址 在段间直接寻址方式中,指令码中将直接给出16位的段地址和16位的段内偏移地址。例:JMP FARPTRADD1 在执行这条段间直接寻址指令时,指令操作码后的第二个字将赋予代码段寄存器CS,第一个字将赋予指令指针寄存器IP。最后CS内容和IP内容相加则得转移地址,如图

7、310所示。,图3.10 段间直接寻址,4段间间接寻址 段间间接寻址方式和段内间接寻址相似。但是,由于确定转移地址需要32位信息,因此段间间接寻址只适用于存贮器寻址方式。用这种寻址方式可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址,而后两单元存放的是16位的段地址,如图3.11所示。例:JMP DWORDPTRBPDI,图3.11 段间间接寻址,3.2 指令系统,8086/8088的指令系统大致可分为7种类型:数据传送指令算数运算指令逻辑运算和移位指令串操作指令程序控制指令处理器控制指令输入/输出指令,数据传送指令 1MOV指令 MOV OPR

8、D1,OPRD2 目的 源 MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器。数据传送方向的示意图如图3.12所示。,图3.12 MOV的数据传送方向,各种数据传送指令例举如下:在CPU各内部寄存器之间传送数据。MOV AL,BL;8位数据传送指令(1个字节)MOV AX,DX;16位数据传送指令(1个字)MOV SI,BP;16位数据传送指令(1个字)立即数传送至CPU的通用寄存器(即AX、BX、CX、DX、BP、SP、SI、D

9、I)。MOV CL,4;8位数据传送(1个字节)MOV AX,03FFH;16位数据传送(1个字),CPU内部寄存器(除了CS和IP以外)与存贮器(所有寻址方式)之间的数据传送,可以传送一个字节也可以传送一个字。在CPU的通用寄存器与存贮器之间传送数据:MOV AL,BUFFER MOVDI,CX 在CPU寄存器与存贮器之间传送数据:MOV DS,DATASIBX MOV DESTBPD1,ES,使用中需要注意的是:MOV指令不能在两个存贮器单元之间进行数据直接传送。MOV指令不能在两个段寄存器之间进行数据直接传送。立即数不能直接传送给段寄存器。目的操作数不能为CS、IP。,其中,的传送可用通

10、用寄存器作为中介,用两条传送指令完成。例如,为了将在同一个段内的偏移地址为AREA1的数据传送到偏移地址为AREA2单元中去,可执行以下两条传送指令:MOV AL,AREA1 MOV AREA2,AL 例如,为了将立即数传送给DS,可执行以下两条传送指令:MOV AX,1000H MOV DS,AX,例如,将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。程序如下:MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 AGAIN:MOV A

11、L,SIMOVD1,AL INC SI INC DI DEC CX JNZ AGAIN,2交换指令 XCHG OPRD1,OPRD2 交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之间进行,但是段寄存器不能作为一个操作数。例如:XCHG AL,CL XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER XCHG BX,DATASI,3地址传送指令 8086/8088有3条地址传送指令。(1)LEA指令 LEA OPRD1,OPRD2 该指令把源操作数OPRD2的地址偏移量传送至目的操作数OPRD

12、1中。(2)LDS指令 该指令完成一个地址指针的传送。(3)LES指令 这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。,4堆栈操作指令 堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定。堆栈操作具有先入后出的特点。用于堆栈操作的指令主要是:PUSH OPRD(堆栈压入指令)POP OPRD(堆栈弹出指令)堆栈操作指令中的操作数可以是段寄存器(除CS)的内容、16位的通用寄存器(标志寄存器有专门的出入栈指令)以及内存的16位字。例如:,MOV AX,8000HMOV SS,AXMOV SP,2000HMOV DX,3E4AHPUSH DXPUSH AX,当执行完两条压

13、入堆栈的指令时,堆栈中的内容如图3.13所示。压入堆栈指令PUSHDX的执行过程为:SP1SP;DH(SP);SP1SP;DL(SP)。弹出堆栈指令POPAX的过程与此刚好相反:(SP)AL;SP1SP;(SP)AH;SP1SP。,图3.13 堆栈操作示意图,5字节、字转换指令 CBW CWD CBW指令将AL的符号位(bit7)扩展到整个AH中,即将字节转换成一个字。例如:MOV AL,4FH CBW 执行后,AX004FH。,CWD指令将AX的符号位(bit15)扩展到整个DX,即将字转换成双字。例如:MOV AX,834EH CWD 执行后,DXFFFFH,DXAXFFFF834EH。,

14、3.2.2 算术运算指令 8086/8088可提供加、减、乘、除4种基本算术运算的操作指令。这些指令可实现字节或字的运算,也可以用于符号数和无符号数的运算。1加法指令(1)ADD OPRD1,OPRD2 这条指令完成两个操作数相加,结果送至目的操作数OPRD1,即:OPRD1OPRD1OPRD2,具体地说,该指令可以实现累加器与立即数、累加器与任一通用寄存器、累加器与存贮单元内容相加,其和放回累加器中。例如:ADD AL,30 ADD AX,3000H ADD AX,SI ADD AL,DATABX,该指令也可以实现任一通用寄存器与立即数、累加器或别的寄存器、存贮单元的内容相加,其和放回寄存器

15、中。例如:ADD BX,3FFH ADD SI,AX ADD DI,CX ADD DX,DATABXSI,该指令还可以实现存贮器操作数与立即数、累加器或别的寄存器的内容相加,其和放回存贮单元中。例如:ADD BETASI,100 ADD BETASI,AX ADD BETASI,DX 这些指令执行时,对标志位CF、OF、PF、SF、ZF和AF都会产生影响。,(2)ADC指令 这条指令与ADD指令基本相同,只是相加时再加上进位位的当前值,即:OPRD1OPRD1OPRD2CF MOV AX,FIRST ADD AX,SECOND MOV THIRD,AX MOV AX,FIRST2 ADC AX

16、,SECOND2 MOV THIRD2,AX,(3)INC OPRD指令 这条指令对指定的操作数进行加1操作,其操作数可以是通用寄存器,也可以在内存单元中。加1操作时,把操作数看作为无符号的二进制数。INC指令常用于在循环程序中修改地址指针和循环次数等。例如:INC AL INCSI,2减法指令(1)SUB OPRD1,OPRD2 该指令进行两个操作数的相减操作,即:OPRD1OPRD1OPRD2(2)SBB指令 该指令与SUB相类似,只是相减时,还应减去借位标志CF的当前值,即:OPRD1OPRD1OPRD2CF,(3)DEC OPRD指令 该指令实现对操作数的减1操作,所用的操作数可以是通

17、用寄存器,也可以在内存单元中。减1操作时,把操作数看作为无符号的二进制数。例如:DEC BX DECDI,4)NEG OPRD 该指令用来对操作数进行求补操作,即对操作数按位取反后加1。例如:NEG AL NEG MULRE,(5)CMP OPRD1,OPRD2 该指令为比较指令,与减法指令一样执行OPRD1OPRD2操作,但相减后不回送结果,只是根据相减结果修改标志位。即:OPRD1OPRD2 比较指令可以用于累加器与立即数,累加器与任一通用寄存器或任一内存操作数之间的比较。例如:CMP AL,100 CMP AX,SI CMP AX,DATABX,该指令也可以用于任一寄存器与立即数或别的寄

18、存器及任一内存操作数之间的比较,例如:CMP BX,04FEH CMP DX,DI CMP CX,COUNTBP 该指令还可以用于内存操作数与立即数及任一寄存器中操作数之间的比较。例如:CMP DATA,100 CMP COUNTSI,AX CMP POINTERDI,BX,综上所述,可以归纳出如下结论:当没有溢出时(OF0),若SF0,则AXBX;若SF1,则AXBX。当产生溢出时(OF1),若SF0,则AXBX;若SF1,则AXBX。用逻辑表达式又可简化为:若OFSF0,则AXBX;若OFSF1,则AXBX。,例如,若自BLOCK开始的内存缓冲区中,有100个带符号的数,希望找到其中最大的

19、一个值,并将它放到MAX单元中。MOV BX,OFFSETBLOCK MOV AX,BX INC BX INC BX MOV CX,99AGAIN:CMP AX,BX JG NEXT MOV AX,BX,NEXT:INC BX INC BX DEC CX JNE AGAIN MOV MAX,AX HLT,3乘法指令 乘法指令分为无符号数乘法指令和带符号数乘法指令两种。(1)无符号数乘法指令MUL 该指令的一般格式为:MUL OPRD;OPRD为源操作数 例:字节乘以字节 MOV AL,LSRC BYTE;被乘数送AL MUL RSRC BYTE;结果存于AX中,字乘以字 MOV AX,LSRC

20、 WORD;一个字送AX MUL RSRC WORD;结果的高字节在DX中,低字节在AX中 字节乘以字 MOV AL,MUL BYTE;字节被乘数送入AL CBW;AL中字节转换成AX中的字 MUL RSRC WORD,(2)带符号数乘法指令IMUL 这是一条带符号数的乘法指令,它和MUL一样可以进行字节和字节、字和字的乘法运算。结果放在AX或DX、AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。该指令的一般格式为:IMUL OPRD 例:字节乘以字节 MOV AL,LSRC_BYTE;被乘数送AL IMUL RSRC_BYTE,4除法指令 8088有两条除法指

21、令:无符号除法指令和带符号除法指令。(1)无符号数除法指令DIV 执行该指令,如果结果大于寄存器可以保存的值时,则产生0型中断。例:字除以字节 MOV AX,NUMERATORWORD;被除数送AX DIV DIVISORBYTE;商在AL中,余数在AH中,字节除以字节 MOV AL,NUMERATORBYTE;被除数送A1 CBW;AL中的字节扩展成AX中的字 DIV DIVISORBYTE 字除以字 MOV AX,NUMERATORWORD CWD;把字转换成双字DX、AX DIV DIVISORWORD;商在AX中,余数在DX中,(2)带符号除法指令IDIV 该指令是带符号的除法指令。执

22、行除法后,余数符号与被除数相同,其他同DIV指令。IDIV指令一般格式为:IDIV OPRD 例:双倍字长除以字 MOV DX,NUMHIWORD;被除数高位字送DX MOV AX,NUMLOWORD;被除数低位字送AX IDIV DIVISORWORDSI,5调整指令 8088的调整指令主要用于十进制数的调整。AAA对AL中ASCII未压缩的十进制和进行调整;AAS对AL中ASCII未压缩的十进制差进行调整;AAD在除法指令前对AX中ASCII未压缩的十进制数进行调整;AAM对AX中两个ASCII未压缩十进制相乘结果进行调整;DAA对AL中的两个压缩十进制数相加之和进行调整,得到压缩十进制和

23、;DAS对AL中的两个压缩十进制数相减之差进行调整,得到压缩十进制差。,3.2.3 逻辑运算和移位指令 逻辑运算和移位指令包括逻辑运算、移位和循环移位指令。1逻辑运算指令(1)NOT OPRD 该指令对操作数进行求反操作,然后将结果送回。操作数可以是寄存器或存贮器的内容。该指令对标志位不产生影响。例如:NOT AL,(2)AND指令 该指令对两个操作数进行按位相“与”的逻辑运算。即只有参加相与的两位全为“1”时,相“与”结果才为“1”;否则相“与”结果为“0”。相“与”结果送回。AND指令可以进行字节操作,也可以进行字操作。AND指令的一般格式为:AND OPRD1,OPRD2,例如:AND

24、AL,0FHAND AX,BXAND SI,BPAND AX,DATA#-WORDAND DX,BUFFERSIBXAND DATA#-WORD,00FFHAND BLOCKBPDI,DX,(3)TEST指令 该指令的操作功能与AND指令相同,其结果将反映在标志位上,但结果不送回,即TEST指令将不改变操作数的值。这条指令通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态。TEST指令的一般格式为:TEST OPRD,im;im是立即数 立即数中哪一位为1,表示要对哪一位进行测试。,例如,若要检测AL中的最低位是否为1,且若为1则转移。在这种情况下可以用如下指令:TEST AL,0

25、1H JNZ THERE THERE:MOVBL,05H,(4)OR指令 该指令对两个操作数进行按位相“或”的逻辑操作,即进行相“或”的两位中的任一位如果为1时,则相“或”的结果为1;如果两位都为0时,其结果才为0。OR指令操作结果将送回。OR指令允许对字节或对字进行相“或”运算。OR指令使标志位CF0,OF0;相“或”操作的结果反映在标志位PF、SF和ZF上;对AF标志位未定义。OR指令的一般格式为:OR OPRD1,OPRD2,例如:OR AL,30HOR AX,00FFHOR BX,SIOR BX,DATAWORDOR BUFFERBX,SIOR BUFFERBXSI,8000H,(5)

26、XOR指令 该指令对两个操作数进行按位“异或”操作,即进行“异或”操作的两位值不同时,其结果为“1”;否则就为0,操作结果送回。XOR指令的一般形式为:XOR OPRD1,OPRD2,例如:XOR AL,0FHXOR AX,BXXOR DX,SIXOR CX,CONNTWORDXOR BUFFERBX,DIXOR BUFFERBXSI,AX,2移位指令 8088有3条移位指令:算术左移和逻辑左移指令SALSHLOPRD,m 算术右移指令SAROPRD,m 逻辑右移指令SHROPRD,m(1)SALSHL指令 这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入

27、标志位CF,如图3.14(a)所示。,图3.14 移位指令示意图(a)SALSHL;(b)SAR;(c)SHR,(2)SAR指令 该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.14(b)所示。SAR指令影响标志位CF、OF、PF、SF和ZF。右移一位相当于除以2,例如:MOV AL,16 SAR AL,1;执行后,AL的内容为8(相当于除以2),(3)SHR指令 该指令每执行一次移位操作,就使操作数右移一位,最低位移至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.14(c)所示。该指令可以执行由m所指定的移位次数。,3循环移位指令

28、 8088有4条循环移位指令:左循环移位指令ROL OPRD,m 右循环移位指令ROR OPRD,m 带进位左循环移位指令RCL OPRD,m 带进位右循环移位指令RCR OPRD,m(1)ROL指令 该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.15(a)所示。,图3.15 循环移位指令示意图(a)ROL;(b)ROR;(c)RCL;(d)RCR,(2)ROR指令 该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.15(b)所示。当规定的循环次数为1时,若循环移位后,

29、操作数的最高位和次高位不相等,则标志位CF1;否则OF0。这可以用来判别移位前后操作数的符号是否有改变。该指令只影响CF和OF标志位。,(3)RCL指令该指令是把标志位CF包含在内的循环左移指令。(4)RCR指令该指令是把进位标志位CF包含在内的右循环指令。,3.2.4 串操作指令 1MOVSMOVSBMOVSW 该类指令是串传送指令,用于内存区之间字节串或字串的传送。串传送指令的一般格式为:MOVS OPRD1,OPRD2;OPRD2是源串,OPRD1是目的串 MOVSB;字节传送 MOVSW;字传送,2CMPS/CMPSB/CMPSW 该类指令是串比较指令,常用于内存区之间的数据、字符等的

30、比较。串比较指令的一般格式为 CMPS OPRD1,OPRD2;OPRD1是源串,OPRD2是目的串 CMPSB;字节比较 CMPSW;字比较,3SCASSCASBSCASW 该类指令是串扫描指令,用于寻找内存区中指定的数据和字符。串扫描指令的一般格式为 SCASOPRD;OPRD是目的串 SCASB;字节操作 SCASW;字操作,4.LODSLODSBLODSW该类指令是串装入指令。串装入指令的一般格式为:LODSOPRD;OPRD为源串 LODSB;字节操作 LODSW;字操作,5STOSSTOSBSTOSW该类指令是字串存贮指令。串存贮指令的一般格式为:STOS OPRD;OPRD为目的

31、串 STOSB;字节操作 STOSW;字操作,6REP REP是串指令的前缀。当某一条串指令需要多次重复时,就可以加上该前缀。重复次数由CX决定,每重复执行一次,CX内容减1,直到CX0为止。7REPEREPNE 它们是条件重复前缀。当条件满足时,才重复执行后面的串指令,一旦条件不满足,重复就停止。REPE指令是相等重复指令,当ZF1且CX未减到0,串指令重复执行。REPNE指令是不相等重复指令,当ZF0且CX未减到0,串指令重复执行。,例:数据段中地址BUFFER1开始的字符串,长度为1000字节,将其传送到附加段中地址BUFFER2开始的数据区。MOV SI,OFFSETBUFFER1;B

32、UFFER1偏移地址送SI MOV DI,OFFSETBUFFER2;BUFFER2偏移地址送DI MOV CX,1000;传送次数送CX CLD;使DF0,SI、DI做加1操作 REP MOVSB;串传送,例:若上例中的BUFFER1和BUFFER2都处于数据段,则程序可修改如下:MOV AX,DS MOV ES,AX;使ESDS LEA SI,BLOCK1;源串地址送SI LEA DI,BLOCK2;目的串地址送DI MOV CX,500;重复次数送CX CLD;使DF0,SI、DI做加2操作 REPE MOVSW;串传送,例:比较数据段中源串SOURCE和附加段中目的串DEST中的500

33、个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。LEA DI,ES:DEST LEA SI,SOURCE MOV CX,500 CLD REPE CMPB JZ NEXTMATCH:DEC SI MOV AL,BYTEPTRSI NEXT:,3.2.5 程序控制指令 程序控制指令主要是指程序转移指令。转移类指令通过改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。1无条件转移、调用和返回指令 这些指令都将引起程序执行顺序的改变。转移有段内转移和段间转移之分。所谓段内转移是指段地址不变,仅IP发生改变;而段间转移时,CS和IP均发生改变。,(1)无条件转移指

34、令JMP 该指令分直接转移和间接转移两种。直接转移又可分短程(SHORT)、近程(NEAR)和远程(FAR)3种形式。当程序执行到JMP指令时,就无条件地转移到指令中所指示的目的地址。该指令的一般格式为JMPOPRD;OPRD是转移的目的地址直接转移的3种形式为:短程转移JMP SHORT OPRD 短程转移中目的地址与JMP指令所处地址的距离应在128127范围之内。近程转移JMP NEA RPTROPRD 或JMP OPRD;NEAR可省略,远程转移JMP FAR PTR OPRD 远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。间接转移

35、指令的目的地址可以由存贮器或寄存器给出:段内间接转移JMP WORD PTR OPRD 段间间接转移JMP DWORD PTR OPRD,(2)调用和返回指令 CALL指令用来调用一个过程,在过程执行完后可使用返回指令RET,使程序返回调用程序继续执行。由于过程有段间(即远程FAR)和段内调用(即近程NEAR)之分,所以CALL也有FAR和NEAR之分,RET也分段间和段内返回两种。这由被调用过程的定义所决定。调用指令一般格式为:CALL NEARPTR OPRD;段内调用 CALL FARPTR OPRD;段间调用,例:近程调用;主程序(近程调用)CALL NEAR PTR PROAD;过程

36、PROAD定义 PROAD PROC NEAR PUSH AX PUSH CX PUSH SI LEA SI,ARY,MOV CX,COUNT XOR AX,AXNEXT:ADD AX,SI ADD SI,2 LOOP NEXT MOV SUM,AX POP SI POP CX POP AX RETPROAD ENDP,例:远程调用;主程序(远程调用)CALL FAR PTR PROADD;过程PROADD定义(远程调用过程)PROADD PROC FAR PUSH AX PUSH CX,PUSH SI PUSH DI MOV SI,BX MOV DI,BX2 MOV CX,DI MOV DI

37、,BX4 XOR AX,AXNEXT1:ADD AX,SI ADD SI,2 LOOP NEXT1 MOVDI,AX,POP DI POP SI POP CX POP AX RETPROADD ENDP,2条件转移指令 条件转移指令将上一条指令所设置的某些标志位的状态作为测试条件,条件满足则转向指令中所指示的目的地址。(1)以单个标志位为条件 JO OPRD;溢出转移 JNO OPRD;不溢出转移 JS OPRD;结果为负转移 JNS OPRD;结果为正转移 JC OPRD;进位转移 JNC OPRD;无进位则转移 JEJZ OPRD;等于或为零转移,(2)无符号数比较JAJNBEOPRD;高

38、于或不低于等于转移JAEJNBOPRD;高于等于或不低于转移JBJNAEOPRD;低于或不高于等于转移JBEJNAOPRD;低于等于或不高于转移(3)带符号数比较JGJNLEOPRD;大于或不小于等于转移JGEJNLOPRD;大于等于或不小于转移JLJNGEOPRD;小于或不大于等于转移JLEJNGOPRD;小于等于或不大于转移,3循环控制指令 该类指令的一般格式为:LOOP OPRD;CX=0循环 LOOPE OPRD;CX=0且ZF=1循环 LOOPNE OPRD;CX=0且ZF=0循环 在LOOPE和LOOPNE两条指令中,只要两个条件中任一个不满足,循环就结束。,例:SUB DI,BX

39、 INC DI MOV CX,DI DEC BXNEXT:INC BX CMP BYTEPTRBX,0 LOOPE NEXT,4软中断指令及中断返回指令 当程序执行到中断指令INT时,便中断当前程序的执行,转向由256个中断向量所提供的中断入口地址之一去执行。软中断指令的一般格式为:INT OPRD;OPRD可以取00HFFH中的值,3.2.6 处理器控制指令 该类指令用来控制处理器与协处理器之间的交互作用,修改标志寄存器,以及使处理器与外部设备同步等。1.标志位操作指令 STC;使CF=1 CLC;使CF=0 CMC;使CF取反 STD;使DF=1 CLD;使DF=0 STI;使IF=1 C

40、LI;使IF=0,2外部同步指令(1)暂停指令HLT(2)空操作指令NOP(3)等待指令WAIT(4)封锁总线指令LOCK(5)处理器交权指令ESC,3.2.7 输入输出指令 输入指令的一般格式为:IN ACC,PORT 它完成从接口到CPU的输入操作。输出指令的一般格式为:OUT PORT,ACC 它完成从CPU到接口的输出操作。,1.直接寻址 输入输出指令中直接给出一个字节表示的接口地址。由于接口地址用一个字节表示,故可寻址的接口地址只有256个(00H到FFH)。例如:IN AL,35H OUT 44H,AX,2.寄存器间接寻址 输入输出指令中接口地址由DX的内容来决定。由于DX是16位

41、的寄存器,故可寻址的接口地址为64K个(0000H到FFFFH)。例如:MOV DX,03F8H IN AL,DX 表示由接口地址03F8H输入一个字节到AL。,3.3 80386/80486指令系统,3.3.1 80386的寻址方式 80386的寻址方式分为三大类。(1)寄存器寻址方式 在这种寻址方式,操作数放在32位、16位或8位的通用寄存器中。(2)立即数方式 操作数以立即数形式出现在指令中。(3)存贮器寻址方式,按照80386系统的存贮器组织方式,逻辑地址由选择子和偏移量组成。偏移量也称为有效地址,由4个分量计算得到:基址:任何通用寄存器都可作为基址寄存器,其内容即为基址。位移量:在指

42、令操作码后面的32位、16位或8位的数。变址:除了ESP寄存器外,任何通用寄存器都可以作为变址寄存器,其内容即为变址值。比例因子:变址寄存器的值可以乘以一个比例因子,根据操作数的长度可为1字节、2字节、4字节或8字节,比例因子相应地可为1,2,4或8。,由上面4个分量计算有效地址的方法为:EA基址变址比例因子位移量图3.16表示了这种寻址计算方法。,图3.16 80386寻址计算方法,按照4个分量组合有效地址的不同方法,可以有下述9种存贮器寻址方式。(1)直接寻址方式 位移量就是操作数的有效地址,此位移量包含在指令中。例:INC WORDPTR500WB;字的有效地址为500(2)寄存器间接寻

43、址方式 操作数的有效地址即基址寄存器的内容。例:MOVECX,EDX;ECX指出有效地址,(3)基址寻址方式 基址寄存器的内容和位移量相加形成有效地址。例:MOV ECX,EAX24;由EAX中内容加24组成有效地址(4)变址寻址方式 变址寄存器的内容和位移量相加形成有效地址。例:ADD EAX,ESI,5;ESI的内容加5组成有效地址(5)带比例因子的变址寻址方式 变址寄存器的内容乘以比例因子,再加位移量得到有效地址。,例:IMUL EBX,ESI4,7;ESI的内容乘以4再加7形成有效地址(6)基址变址寻址方式 基址寄存器的内容加变址寄存器的内容组成有效地址。例:MOV EAX,ESIEB

44、X;EBX的内容加ESI的内容即有效地址(7)基址加比例因子变址寻址方式 变址寄存器的内容乘以比例因子,再加上基址寄存器的内容作为有效地址。例:MOV ECX,EDI8EAX;EDI内容乘以8再加EAX内容即为有效地址,(8)带位移量的基址变址寻址方式 基址寄存器的内容加变址寄存器的内容,再加位移量形成有效地址。例:ADD EDX,ESIEBP100H;ESI的内容加EBP的内容再加100H;即为有效地址(9)带位移量的基址比例因子变址方式 变址寄存器的内容乘以比例因子,再加上基址寄存器的内容,又加上位移量,形成有效地址。例:MOV EAX,EDI4EBP80;EDI的内容乘4,加EBP的内容

45、,;再加80即有效地址,3.3.2 386/486改进的指令 1.MOV指令 32位的源操作数传送到32位的目的中,目的与源均可为通用寄存器或存贮器,但不能同时为存贮器,源还可以为32位的立即数。例:MOV EAX,EBX MOV DWORD PTREBX,345678H,2.堆栈指令(1)PUSH、POP指令 PUSH指令将32位的通用寄存器、存贮器或立即数压入堆栈;POP指令则将堆栈指针指示的两个存贮字弹出给32位的通用寄存器或32位的存贮器。例:PUSH EAX PUSH 12345678H POP EBX POP DWORDPTR 另外,80868088执行PUSHSP指令是将SP减2

46、后的值进栈,而8028680386执行PUSHSP(或PUSHESP)指令时,是将执行本指令之前的SP(或ESP)进栈。,(2)立即数压栈指令 格式:PUSH nnnn 功能:将字立即数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.加法和减法

47、指令 目的与源均可为32位的通用寄存器或存贮器,但不能同时为存贮器,源还可以为32位的立即数。例:ADD EAX,EBX ADC ECX,DWORDPTR3888H SUB EDX,EAX SBB ECX,123456H,5.无符号乘法指令 源为32位的通用寄存器或存贮器,隐含在EAX中的被乘数乘以32位的源操作数产生64位的积,即EAX源EDX:EAX。例:MUL ESI;EAX*ESIEDX:EAX,6.除法指令 源为32位的通用寄存器或存贮器,隐含在EDX:EAX中的64位的被除数除以32位的源操作数,产生32位的商存入EAX中,余数存入EDX中。例:DIV EBX;EDX:EAX/EB

48、X,商EAX,余数EDX IDIV ECX;EDX:EAX/ECX,商EAX,余数EDX,7.有符号乘法指令 格式1:IMUL源 本指令与MUL指令的功能完全相同,但IMUL指令隐含的一个操作数与源操作数以及结果均为有符号数(补码形式)。如果结果的高半部分(在EDX中)仅仅是低一半的符号的扩展,则CFOF0,否则CFOF1。格式2:IMUL目的,源 格式3:IMUL目的,源1,源2 格式2、3与格式1是同一类型指令,但取乘积的长度不同。,例:IMUL EDX,EBX;EDXEBXEDXIMUL EBX,4000H;EBX4000HEBXIMUL ECX,EAX,88H;EAX88HECXIMU

49、L EDX,DWORDPTREBX,3456H;EBX3456HEDX,8.INC、DEC指令 操作数可为32位的通用寄存器或存贮器。例:INC EDI DEC DWORDPTREBXEAX49.比较指令 例:CMP EAX,ESI;EAXESI CMP EDX,EBX1000H,10.逻辑运算指令 目的与源均可扩充为32位的通用寄存器或存贮器,但不得同时为存贮器,源操作数还可为32位的立即数。例:AND EAX,BCX OR ECX,EBX XOR ESI,ESI NOT EDX TEST DWORDPTR1000H,80H,11.移位指令 目的可扩充为32位的通用寄存器或存贮器,源可为任一

50、8位的立即数或CL寄存器。例:SHL ECX,3 SHR EAX,CL SAL DWORDPTREBX,CL SAR DWORD PTREBXEAX4,20H,12.串指令 DS:ESI源串,ES:EDI目的串的相应功能的双字操作,ESI和EDI加4或减4,ECX寄存器为计数器。13.串输入指令 格式1:REPINS目的串,DX 格式2:REPINSB REPINSW REPINSD,例:INSM-WORD,DX INSB REP INSB INSW 例:OBJECT DD 100DUP(?);定义100个双字存贮空间 CLD;0DF MOV EDI,OFFSETOBJECT;目的串首地址的偏

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号