《微型计算机原理》课件chapter3 8086指令系统_第1页
《微型计算机原理》课件chapter3 8086指令系统_第2页
《微型计算机原理》课件chapter3 8086指令系统_第3页
《微型计算机原理》课件chapter3 8086指令系统_第4页
《微型计算机原理》课件chapter3 8086指令系统_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

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

文档简介

2024年3月19日第1页寻址方式1指令系统2系统功能调用3主要内容2024年3月19日第2页

一条指令一般包括操作码和操作数两个部分:操作码操作数1,操作数2

操作码表示机器执行什么性质的操作;操作数指定参加运算的数据或存放数据的地方。一条指令中,操作数可以没有,可以有一个或是两个,对有两个操作数的指令而言,前面一个是目的操作数,后一个是源操作数。

指令的基本格式MOVOPRD1,OPRD2AX1234H2024年3月19日第3页§3.1寻址方式指令中说明操作数所在地址或指令获得转移地址的方法。操作数可以存放在寄存器、存储器或I/O端口中,操作数地址的计算方法因不同的寻址方式而异。寻址方式的多样化,扩大了指令系统的灵活性。2024年3月19日第4页说明操作数所在地址的寻址方式:立即寻址直接寻址寄存器寻址寄存器间接寻址寄存器相对寻址基址、变址寻址基址、变址相对寻址隐含寻址操作码0310……ABC0代码段数据段§3.1.1操作数寻址方式2024年3月19日第5页1.立即寻址

操作数就是一个立即数,它直接包含在指令中,与操作码一起存放在代码段。MOVAX,3100H…操作码0031AXAHAL3100代码段…2024年3月19日第6页2.直接寻址操作数地址的段内偏移地址(16位)直接包含在指令中。操作码0031……3412MOVAX,[3100H]30000DS3100+3310033100HAXAHAL33101H3412代码段数据段2024年3月19日第7页3.寄存器寻址操作数在CPU的内部寄存器中(寄存器可是8位,也可是16位的)MOVBX,AX12A6HBX12A6HAX2024年3月19日第8页4.寄存器间接寻址操作数的偏移地址(16位)放在寄存器SI、DI、BP、BX中之一,操作数本身存放在存储器中。若以SI、DI、BX进行间接寻址,操作数存放在数据段中。若以BP进行间接寻址,操作数存放在堆栈段中。DSSS2024年3月19日第9页…………操作码9ABC3412F5代码段数据段堆栈段MOVAX,[SI]DS20000HSI1000H+21000H21000H21001HAXAHAL341263000H63001H

用作间址的寄存器(SI、DI、BX、BP)必须加上方括号例:2024年3月19日第10页…………操作码9ABC3412F5代码段数据段堆栈段63000H63001H21000H21001HMOV[BP],AXSS60000HBP3000H+63000HAXAHAL9ABC2024年3月19日第11页5.寄存器相对寻址操作数的偏移地址(16位)是寄存器SI、DI、BP、BX中之一的内容加上由指令中所指出的8位或16位相对地址偏移量得到的。操作数本身存放在存储器中。偏移地址EA=[BX][BP][SI][DI]+8位位移量16位位移量2024年3月19日第12页操作码0310……ABC0代码段数据段MOVBX,[SI+1003H]63203H60000HDS2200HSI1003H+63203H位移量BXBHBLABC0MOVBX,[SI+1003H]MOVBX,DISP[SI]MOVBX,[SI+DISP]MOVBX,[SI]+DISP2024年3月19日第13页6.基址变址寻址

是将基址寄存器和变址寄存器联合起来进行寻址的方式。基址寄存器:BX、BPDSSS变址寄存器:SI、DI偏移地址EA=[BX][BP][SI][DI]+2024年3月19日第14页操作码……ABC0代码段堆栈段MOVAX,[SI][BP]30000HSS1000H2000H+33000H33000HSIBPAXAHALC0ABMOVAX,[BX][BP]MOVAX,[SI][DI]错!2024年3月19日第15页7.相对基址加变址寻址比基址、变址寻址多了8位或16位的相对位移量。偏移地址EA=[BX][BP][SI][DI]++8位位移量16位位移量2024年3月19日第16页操作码64……ABC0代码段数据段…MOVAX,COUNT[BX][SI]6C764H60000H2200HA500H64H+6C764HDSSIBXCOUNTAXAHALC0AB6C765H2024年3月19日第17页8.隐含寻址是将操作数的地址隐含在指令操作码中的寻址方式。例如:MULBL;BL乘AL,结果存放在AX中2024年3月19日第18页操作数寻址方式小结数据寄存器立即寻址寄存器寻址数据指令指令寄存器直接寻址EA数据指令内存寄存器EA数据指令寄存器内存寄存器间接寻址寄存器相对寻址寄存器位移量数据指令内存段地址操作均在CPU内进行,执行速度快。操作数在内存数据区中。段地址2024年3月19日第19页基址变址寻址基址寄存器变址寄存器数据指令内存段地址相对基址加变址寻址基址寄存器位移量数据指令内存有效地址有效地址变址寄存器段地址操作数寻址方式小结2024年3月19日第20页习题设BX=0158H,DI=10A5H,DISP=1B57H

DS=2100H,SS=1100H,BP=0100H如何确定下列指令的EA和物理地址?(1)MOVAX,DISP(2)MOVAX,BX(3)MOVAX,[BX](4)MOVAX,DISP[BP](5)MOVAX,[BX][DI](6)MOVAX,DISP[BP][DI]2024年3月19日第21页§3.1.2转移地址的寻址方式段内相对寻址段内间接寻址段间直接寻址段间间接寻址用于说明程序转移目标地址的寻址方式。当CPU执行转移、调用、中断等指令时,程序执行指令的顺序将不再是顺序执行,而是发生跳转,转移地址寻址方式就是告诉CPU转移目标地址的计算方法,更改内部寄存器IP或者IP与CS的值,实现程序的跳转。2024年3月19日第22页1.段内相对寻址转移地址=CS+IP+偏移量………操作码50HJMPDISP1P70若此时CS内容为2000H,CPU读取该指令后,IP内容为1000H。则:该指令使CPU转向2000:1050H2000:0FFFH操作码2000:1050H(IP)=1000H1050H指令中直接给出转移目标地址,而形成的指令机器码中给出的是该目标地址与当前IP值的相对地址位移量(带符号数,补码表示)。2024年3月19日第23页2.段内间接寻址段内偏移地址存放在16位寄存器中,或是存储器的两个相邻单元中。………操作码2000:0FFFH操作码2000:4000HJMPCX若此时CS的内容为2000H,CX的内容为4000H,则:该指令使CS保持不变,而IP值变为CX的内容,即,使CPU转向2000:4000H2024年3月19日第24页操作码2000:4000HJMPWORDPTR[BX]………2000:0FFFH操作码数据段5000:1000H…若此时CS=2000H,DS=5000H,BX=1000H,5000:1001H4000则:该指令使CPU到数据段中偏移地址为1000H开始的两个单元中找到新IP的值,并转向CS:IP新处。2024年3月19日第25页3.段间直接寻址指令码中直接给出16位的段地址及偏移地址。JMPFARPTRADD1……操作码…偏移地址低字节偏移地址高字节段地址低字节段地址高字节操作码+1234H:5678H1234H:5678H34H12H78H56H2024年3月19日第26页4.段间间接寻址转移地址放在存储器中,从起始地址开始依次存放偏移地址低、高字节和段地址的低、高字节信息。JMPDWORDPTR[BP][DI]若当前CS=3000H,SS=2000H,BP=1000H,DI=0050H,内存单元(21050H~21053H)=00H,66H,00H,40H,则执行指令后:新IP=6600H,新CS=4000H转移目的地址为:46600H2024年3月19日第27页JMPtargetJMPCXJMPfarptrtargetJMPDWORDPTR[SI]JMPWORDPTR[BX]JMPshorttarget段内直接短转移段内直接转移段内间接转移段内间接转移段间直接转移段间间接转移2024年3月19日第28页§3.2指令系统

数据传送指令算术运算指令逻辑运算和位移指令串操作指令程序控制指令处理器控制指令P722024年3月19日第29页数据传送指令输入输出指令标志位传送指令地址传送指令通用数据传送指令1、数据传送指令2024年3月19日第30页通用数据传送指令MOV、PUSH和POP、XCHG、XLAT1)MOVOPRD1,OPRD2目的操作数源操作数功能:OPRD1OPRD2源操作数:寄存器、存储器及立即数目的操作数:寄存器、存储器MOVAX,1000HMOV[BX],AX2024年3月19日第31页MOV指令数据传送方向存储器通用寄存器AXBXCXDXSPBPSIDI段寄存器DSSSESCS立即数2024年3月19日第32页MOVCS,AX注意:MOV2020H,DXMOVAX,BLMOV[100H],[BX]MOV[AX],1000HMOVDS,ESMOVDS,2000H1.CS和IP不用传送指令改变内容,但CS可为源操作数。2.立即数不可为目的操作数。3.不允许不同类型的操作数互相传送。4.不能用一条MOV指令实现存储单元之间、段寄存器之间以及立即数至段寄存器的传送。2024年3月19日第33页判别下列指令是否合法?1.MOV[DI],[SI+6]2.MOVCS,AX3.MOVAX,[SI][DI]4.MOV120,CL5.MOVBL,[BX]6.MOVDS,CS7.MOV[AX],BX8.MOVSS,1000H9.MOVSS,[1000H]10.MOVCS:[DI],2008H课堂练习2024年3月19日第34页2)交换指令XCHGOPRD1,OPRD2目的源功能:把一个字节或一个字的源操作数与目的操作数相交换。可实现通用寄存器之间、通用寄存器和存储器之间的交换。XCHGAL,BLXCHGBX,SIXCHG[BP][DI],AX若(AL)=8AH,(BL)=A8H,则执行XCHGAL,BL指令后,(AL)=A8H,(BL)=8AH注意:1、存储器之间不可交换;2、段寄存器不能作为操作数。P732024年3月19日第35页3)堆栈操作指令PUSH和POPPUSHOPRD2;压入堆栈POPOPRD1;弹出堆栈

源目的操作数:通用寄存器(16位)、存储器(16位)、段寄存器堆栈:

堆栈是CPU在内存中按照先入后出的原则建立起来的向下(朝地址减小的方向)生长的临时存储区。栈顶:

堆栈中当前可用PUSH或POP指令与之交换数据的存储单元。堆栈指针寄存器SP可自动进行调整,其内容总是当前栈顶的偏移地址。P742024年3月19日第36页MOVAX,8000HMOVSS,AXMOVSP,2000HMOVDX,3E4AHPUSHDX

PUSHAXPOPAXPOPDX……(SP)82000H81FFFH81FFEH81FFDH81FFCH例2024年3月19日第37页PUSHDX

……(SP)82000H81FFFH81FFEH81FFDH81FFCH(SP)(SP)SP-1SP①②DH(SP)③SP-1SPDL(SP)④DX=3E4AH3E4A2024年3月19日第38页PUSHAX

……82000H81FFFH81FFEH81FFDH81FFCH(SP)(SP)(SP)SP-1SP①②AH(SP)③SP-1SPAL(SP)④AX=8000H3E4A80002024年3月19日第39页POPAX

……82000H81FFFH81FFEH81FFDH81FFCH(SP)SP+1SP②①(SP)ALSP+1SP④3E4A③(SP)AH8000AHAXAL0080(SP)(SP)2024年3月19日第40页堆栈段的读写特点:

2、“向下生长”:PUSH存放数据总从高地址向低地址,而内存中其它段是从低地址向高地址放。1、“先进后出”:凡用PUSH指令最后推入堆栈的数据,用POP时最先出栈。注意:PUSHCS指令合法;POPCS不合法!

3、“按字操作”:PUSH和POP指令操作的对象一定是16位二进制数,即操作数为字。2024年3月19日第41页4)换码指令XLAT功能:将内存数据段中地址为BX+AL中的内容放入通用寄存器AL中,完成一个字节的数据转换功能。010000000111100100100100┆00000010BX+0BX+1BX+2BX+AL+BXAL00000110AL00000010注:换码指令用于将BX指定的缓冲区中、AL指定的位移处的数据取出赋给AL。

2024年3月19日第42页5)数据扩展指令CBWCWDCBW功能:将累加器AL或AX中的一个字节的数扩展为一个字,即将AL的最高位扩展到AH中。CWD功能:将累加器AX中的一个字扩展为一个双字,即将AX的最高位扩展到DX中。P752024年3月19日第43页例如:MOVAL,6DH CBW;(AH)=00H,(AL)=6DH MOVAX,8086H CWD;(DX)=FFFFH,(AX)=8086H2024年3月19日第44页地址传送指令(包括LEA、LDS、LES)1)LEAOPRD1,OPRD2目的源功能:把源操作数的偏移地址传送至目的操作数中。源操作数:存储器操作数目的操作数:16位通用寄存器说明:

1.该指令通常用来建立串操作指令所需的寄存器指针。MOVOPRD1,OFFSETOPRD22.该指令的执行效果与下面的指令执行效果相同。2024年3月19日第45页例:LEABX,[BX][SI]指令执行前BX=2000H,SI=4000H指令执行后BX=2000H+4000H=6000HLEAAX,table[SI]MOVAX,OFFSETtableADDAX,SI相当于2024年3月19日第46页2)LDSOPRD1,OPRD2源目的源操作数:存储器操作数目的操作数:16位指针或变址寄存器

功能:该指令完成一个4字节的地址指针的传送。即从源操作数指定的存储单元开始的4个相邻存储单元中,前两个字节送入指定的16位寄存器,后两个字节送入段寄存器DS中。2024年3月19日第47页例:LDSSI,[0010H]……20000180DS=4000H40010H40013H40012H40011H执行指令后:SI=0180HDS=2000H2024年3月19日第48页3)LESOPRD1,OPRD2源目的源操作数:存储器操作数目的操作数:16位指针或变址寄存器功能:该指令完成四个字节的地址指针的传送。其中地址指针的前两个字节送入16位的寄存器,后两个字节送入段寄存器ES中。2024年3月19日第49页例:LESDI,[0010H]……20000180DS=8000H80010H80013H80012H80011H执行指令后:DI=0180HES=2000H2024年3月19日第50页标志位传送指令包括LAHF、SAHF、PUSHF和POPF1)读取标志指令LAHF

将FLAG中的低8位送到AH中,各标志位分别被传送到AH的对应位。OFDFIFTFSFZFAFPFCFD7D6D4D2D0FLAGSAH不影响标志位2024年3月19日第51页2)设置标志指令SAHF传送方向与LAHF相反,将AH中的内容传送到FLAG的对应位。3)PUSHF和POPF对标志寄存器的压入堆栈和弹出堆栈指令。两者配合使用,一般用在子程序和中断服务程序的首尾,起保护和恢复主程序标志的作用。影响标志位PUSHF不影响标志位;POPF影响标志位2024年3月19日第52页输入输出指令专门用于对接口进行输入输出操作,完成AX或AL与I/O端口之间的数据传送功能。说明:

端口地址可以用立即数(0~256)直接给出(直接寻址),也可以用DX的内容(间接寻址)来给出。INAL,50HINAX,50HOUT44H,ALOUT89H,AXMOVDX,383HINAL,DXINCDXOUTDX,AXINACC,PORT

;从指定端口PORT送数到累加器OUTPORT,ACC;将累加器中的数从端口输出2024年3月19日第53页§3.2指令系统数据传送指令

算术运算指令逻辑运算和位移指令串操作指令程序控制指令处理器控制指令2024年3月19日第54页算术运算指令加法指令减法指令乘法指令除法指令十进制调整指令2、算术运算指令2024年3月19日第55页加法指令ADD、ADC、INC存储器通用寄存器通用寄存器通用寄存器存储器立即数通用寄存器存储器+++++2024年3月19日第56页1)ADDOPRD1,OPRD2功能:完成两个操作数相加,结果送目的操作数(OPRD1)。源操作数:存储器、通用寄存器、立即数目的操作数:存储器、通用寄存器ADDAL,19ADDCX,3000HADDDI,BXADDDX,DATA[BP+SI]ADD[BX],AX说明:1、字和字节操作均可;2、指令执行时,对CF、OF、PF、SF、ZF和AF都会产生影响;3、适用于有、无符号数的运算;4、不允许在两个存储器操作数间进行加法操作。

ADD[BX],[SI]2024年3月19日第57页2.ADCOPRD1,OPRD2是两操作数进行相加操作时要加上进位位的当前值,然后将结果送目的操作数。OPRD1OPRD1+OPRD2+(CF)主要用于多字节加法运算。例:两个四字节无符号数相加。它们分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求将运算后得到的和放在4000H开始的内存单元中。MOVAX,[2000H]ADDAX,[3000H]MOV[4000H],AXMOVAX,[2002H]ADCAX,[3002H]MOV[4002H],AX(带进位加法指令)2024年3月19日第58页3)INCOPRD加1指令:将操作数的内容加1,再送回该操作数。操作数可是通用寄存器和存储器,但不能是段寄存器和立即数。OPRDOPRD+1

说明:(1)该指令将操作数视为无符号数。(2)可以进行字或字节加1,取决于操作数的类型。INCBLINCAXINCBYTEPTR[SI+10]字节字字节(3)该指令的操作结果不影响进位标志CF。2024年3月19日第59页SUBAX,BXSUB[SI],30HSUB[BP+DI],CL减法指令1)SUBOPRD1,OPRD2功能:完成两个操作数相减,结果送目的操作数。源操作数:存储器、通用寄存器、立即数目的操作数:存储器、通用寄存器说明:1、字和字节操作均可;2、指令执行时,对CF、OF、PF、SF、ZF和AF都会产生影响;3、适用于有、无符号数的运算;4、不允许在两个存储器操作数间进行减法操作。

SUB[BX],[SI](SUB、SBB、DEC、NEG、CMP)2024年3月19日第60页2)SBBOPRD1,OPRD2功能:两操作数进行相减操作时要减去进位位的当前值,然后将结果送目的操作数。OPRD1OPRD1-OPRD2-(CF)主要用于多字节减法运算,用法与ADC指令基本相同。(带借位减法指令)2024年3月19日第61页3)DECOPRD减1指令:将操作数的内容减1,再送回该操作数。OPRDOPRD-1操作数可是通用寄存器和存储器,但不能是段寄存器和立即数。用法和注意事项与INC指令相同。说明:(1)该指令将操作数视为无符号数;(2)进行字或字节减1时取决于操作数的类型。DECCLDECBXDECBYTEPTR[DI]字节字字节在循环程序中常利用DEC指令修改循环次数。MOVAX,0FFFFHCYC:DECAXJNZCYCHLT2024年3月19日第62页4)NEGOPRD取补指令用来对操作数进行求补操作。操作数是通用寄存器和存储器。1、该指令在字节操作时对-128求补,或在对字操作时对-32768求补,则操作数不变,但溢出标志OF=1。说明:2、利用NEG指令可得到负数的绝对值。例:设AL=FFH,执行NEGAL后,结果为AL=01H3、使用NEG指令时,除非操作数为零,CF总是置1。2024年3月19日第63页5)CMPOPRD1,OPRD2比较指令执行两操作数的相减操作,但不送回相减的结果,只影响标志位。两操作数内容不变化。源操作数:存储器、通用寄存器、立即数目的操作数:存储器、通用寄存器CMPAL,0AHCMPDX,SICMP[BX+5],AXCMPBUF,100不能在两个存储单元之间进行比较。2024年3月19日第64页比较指令主要用来确定两个数之间相等或大小的关系。在比较指令之后,通常要对标志位进行检查,标志位的不同状态,反映了两个数的不同关系。当标志位ZF=1时,表明两个相比较的操作数相等。ZF=0时,要根据不同情况分别判断:对于无符号数的比较,可根据CF标志判断;对于带符号数的比较,需要由OF和SF来判断。注意:2024年3月19日第65页

比较指令主要用来确定两个数之间相等或大小的关系。当ZF=0时:1、无符号数的比较根据CF判别大小CMPAX,BXCF=1,AX<BXCF=0,AX>BX2、带符号数的比较CMPAX,BXOF=0时,若SF=0,则AX>BX若SF=1,则AX<BXOF=1时,若SF=0,则AX<BX若SF=1,则AX>BX2024年3月19日第66页比较指令对标志位的影响数据类型关系CFZFSFOF带符号数目的=源0100目的<源—010—001目的>源—000—011无符号数目的=源0100目的<源10——目的>源00——2024年3月19日第67页比较指令通常与条件转移指令的结合使用,为程序的转移提供判决条件。例:内存数据段中以DATA开设的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者送到MAX单元。LEABX,DATAMOVAL,[BX]INCBXCMPAL,[BX]JNCP1P1:MOVMAX,ALHLT

MOVAL,[BX]2024年3月19日第68页例:内存数据段中以DATA开设的存储单元中分别存放了8个8位无符号数,试比较它们的大小,并将大者送到MAX单元。LEABX,DATAMOVAL,[BX]INCBXAGAIN:CMPAL,[BX]JNCP1MOVMAX,ALHLTMOVAL,[BX]MOVCX,7P1:INCBXDECCXJNZAGAIN2024年3月19日第69页乘法指令(MUL、IMUL)1)MULOPRD源功能:无符号数乘法指令源操作数:通用寄存器、存储器目的操作数:AL、AX或DXAXAL×OPRDDX:AXAX×OPRD字节乘法字乘法源操作数不能是立即数。MUL15HMULALMULBXMULWORDPTR[SI]2)IMULOPRD带符号数乘法指令2024年3月19日第70页除法指令(DIV、IDIV)1)DIVOPRD源无符号数除法指令源操作数:通用寄存器、存储器目的操作数:AX、DXALAX/OPRDAXDX:AX/OPRD字节除法字除法源操作数不能是立即数。DIVBLDIVCXDIVBYTEPTR[DI]AHAX%OPRDDXDX:AX%OPRD2)IDIVOPRD带符号数除法指令对非整数商舍去尾数,而余数的符号总是与被除数的符号相同。2024年3月19日第71页说明:除法指令规定:不允许两个字长相等的操作数相除。若被除数和除数的字长相等,则需扩展被除数字长。无符号数扩展字长:只需在高位添足够个数的零。MOVAL,0FBHXORAH,AH带符号数扩展字长时,应针对是正数还是负数,分别在高位添上相应的符号位。CBW:一个字节转换为一个字若AL<80H,则AH0,否则AH=FFHCWD:一个字转换为双字若AX<8000H,则DX0,否则DX=FFFFHMOVAL,[SI]CBWIDIVBYTEPTR[BX]2024年3月19日第72页已知AX=2000H,DX=200H,BX=1000H执行指令DIVBX后AX=?DX=?AX=2002HDX=0000H课堂练习2024年3月19日第73页十进制调整指令十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果,以此实现十进制BCD码运算8088指令系统支持两种BCD码调整运算压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为02024年3月19日第74页真值(十进制) 8 64二进制表示00001000D01000000D十六进制表示 08H 40H压缩BCD码 08H 64H非压缩BCD码 08H 0604HASCII码 38H 3634H十进制运算调整指令分为以下两类:1、压缩BCD码加减法调整指令DAADAS2、非压缩BCD码加减乘除法调整指令AAAAASAAMAAD2024年3月19日第75页DAA功能:对AL中的两位压缩BCD数的“和”进行十进制调整。DAS功能:对AL中的两位压缩BCD数的“差”进行十进制调整。例如:设(AL)=55H,(BL)=38H,则:ADDAL,BL;DAA;SUBAL,BL;

DAS;执行结果(AL)=8DH执行结果(AL)=93H执行结果(AL)=5BH执行结果(AL)=55H2024年3月19日第76页AAA功能:对AL中的非压缩BCD数的“和”进行十进制调整。AAS功能:对AL中的非压缩BCD数的“差”进行十进制调整。例如:设(AX)=0035H,(BL)=38H,则:ADDAL,BL;AAA;SUBAL,BL;

AAS;注:调整产生的进位放入AH,借位由AH提供。执行结果(AL)=6DH执行结果(AX)=0103H执行结果(AX)=01CBH执行结果(AX)=0005H2024年3月19日第77页AAM

功能:对AX中的非压缩BCD数的乘积进行十进制调整。将AL中的二进制乘积转换为非压缩BCD数,高位放入AH低位放入AL。具体做法:将AL内容除以10,商放入AH,余数放入AL。AAD

功能:对AX中的非压缩BCD数(被除数)进行二进制调整。将AX中的非压缩BCD数转换为二进制数放入AL。具体做法:将AH内容乘以10,加上AL的内容,结果放入AL中,同时将AH清零。注意:BCD码进行乘除法运算时,一律使用无符号数形式,因而AAM和AAD应固定地出现在DIV之前和MUL之后。2024年3月19日第78页例如:设(AX)=0005H,(BL)=08H,则:MULBL;AAM;AAD;

DIVBL;执行结果(AX)=0028H执行结果(AX)=0400H执行结果(AX)=0028H执行结果(AX)=0005H2024年3月19日第79页§3.2指令系统数据传送指令算术运算指令逻辑运算和位移指令串操作指令程序控制指令处理器控制指令P722024年3月19日第80页逻辑运算指令(AND、OR、NOT、XOR、TEST)1)ANDOPRD1,OPRD2目的源与指令:两操作数按位相“与”,结果送回目的操作数。源操作数:立即数、通用寄存器、存储器目的操作数:通用寄存器、存储器ANDAL,0FHANDCX,DIAND[BX][SI],0FFFEH例:

两存储单元间不可相“与”。3、逻辑运算和移位指令2024年3月19日第81页⑴AND指令可用于屏蔽某些位,而保留一些感兴趣的位。MOVAL,‘6’ANDAL,0FH;(AL)=00110110B;(AL)=00000110BEg1:⑵某一个操作数若自己与自己相与,操作数不变,但可使进位标志位CF清零。与指令说明:2024年3月19日第82页Eg2:以下几条指令判断从键盘输入的字符是否为‘Y’,但对键入的字符大写或小写不加区别。MOVAH,8INT21HANDAL,11011111BCMPAL,‘Y’JEYES…YES:…2024年3月19日第83页2)TESTOPRD1,OPRD2测试指令TEST与AND执行同样的操作,但TEST不把逻辑运算的结果送回目的操作数。相“与”的结果反映在标志位上。TESTBH,7TESTSI,BP

TEST通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态;常与条件转移指令一起完成对特定位状态的判断。INAL,PORTTESTAL,00000001BJNZNEXT…NEXT:……2024年3月19日第84页2)TESTOPRD1,OPRD2测试指令TEST与AND执行同样的操作,但TEST不把逻辑运算的结果送回目的操作数。相“与”的结果反映在标志位上。TESTBH,7TESTSI,BP

TEST通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态;常与条件转移指令一起完成对特定位状态的判断。INAL,PORTTESTAL,00101010BJNZNEXT…NEXT:……2024年3月19日第85页3)OROPRD1,OPRD2目的源或指令:两操作数按位相“或”,结果送回目的操作数。4)XOROPRD1,OPRD2目的源异或指令:两操作数按位相“异或”,结果送回目的操作数。源操作数:立即数、通用寄存器、存储器目的操作数:通用寄存器、存储器2024年3月19日第86页

⑴OR指令可将操作数中某些特定位置“1”,同时保持其余位不变。ORAX,8080H;将AH及AL的最高位同时置“1”,AX中其余位不变。

⑵操作数自身相或将不改变操作数的值,但可使CF清零。ORBX,DATA[SI]或指令说明:2024年3月19日第87页

⑴XOR指令可将操作数中某些特定位求反,同时保持其余位不变。要求反的位可和“1”异或,保持不变的位和“0”异或。MOVAL,0FH

⑵将寄存器的内容清零。XORAL,0AAH;(AL)=00001111B;(AL)=10100101BXORAX,AX;(AX)=0异或指令说明:2024年3月19日第88页5)NOTOPRD非指令:将操作数按位取反,结果送回操作数。操作数:通用寄存器、存储器NOTAHNOTCXNOTWORDPTR[1000H]例如:注:1、NOT指令对所有标志位均不产生影响。

2、其余逻辑运算指令总是将CF、OF清零,影响所有状态标志。MOVAH,36HNOTAH

;AH=0C9H2024年3月19日第89页ORCL,03HANDAL,0F5HXORAH,0FH[1]将CL的位0和位1置1,其余位不变[2]将AL的位1和位3清零,其余位不变[3]将AH的低4位取反,高4位不变[4]测试AL的位1是否为零,若为零则转移TESTAL,02HJZZER课堂练习:2024年3月19日第90页移位指令CF0低高CF低最高位SAL/SHL指令SAR指令CF0低高SHR指令⑴这些指令可对寄存器或存储单元中的8位或16位操作数进行移位。⑵指令中规定的移位次数不允许是1

以外的常数或CL以外的寄存器。⑶所有移位指令执行时,都会影响标志位CF、OF、PF、SF和ZF。⑷逻辑移位指令执行时,把操作数看成无符号数进行移位,故右移时最高位添0:算术移位指令执行时,把操作数看成带符号数进行移位,故右移时最高位不变。2024年3月19日第91页1)SAL/SHLOPRD,mm移位次数每移位一次在右面最低位补0,而左面最高位移入CF。CF0低高SHLAL,1SALSI,CL例:;设SI=A450H,CL=02H,执行该指令后,SI=9140H,CF=0算术左移和逻辑左移指令对OF的影响:判别移位前后符号位是否一致在移位次数为1时,若移位后,操作数的最高位与CF不相等,则OF=1;否则OF=0。移位次数不为1时,OF不确定。2024年3月19日第92页一个无符号数左移1位,相当于该数乘2。例:将一个16位无符号数乘以10,该数原来存放在以FACTOR为首址的两个连续存储单元中(低位在前,高位在后)。FACTOR×10=FACTOR×8+FACTOR×2MOVAX,FACTORSHLAX,1MOVBX,AXSHLAX,1SHLAX,1ADDAX,BXHLTMOVCL,2SHLAX,CL2024年3月19日第93页2)SAROPRD,m(m移位次数)CF低最高位算术右移指令每移位一次,操作数右移一位,但符号位保持不变,最低位移入CF。例:SARDI,CL设DI=0064H,CL=05H,则指令执行后,DI=0003H,CF=0,SF=0,ZF=0,PF=1

算术右移1次,相当于带符号数除以2。2024年3月19日第94页3)SHROPRD,mm移位次数逻辑右移指令每移位一次,操作数右移一位,左面的最高位补0,最低位移入CF。例:SHRBL,1设BL=F0H,则指令执行后,BL=78H,CF=0,OF=1CF0低高SHR指令逻辑右移1位的操作,相当于将寄存器或存储单元中的无符号数除以2。2024年3月19日第95页循环移位指令CF低高·CF低高CF低高CF低高ROL指令ROR指令RCL指令RCR指令2024年3月19日第96页⑴这四条指令可对字节或字进行操作,操作数可以是寄存器或存储单元。移位时,移动位数可以是1或是由CL寄存器指定的。⑵这四条指令只影响标志位CF、OF。⑶ROL和RCL指令在执行一次左移后,若操作数最高位和CF不等,则OF置1:否则置0。OF的值表示循环移位前后符号位是否有所变化。⑷ROR和RCR指令在执行一次右移后,若操作数最高位和次高位不等,则OF置1:否则置0。OF的值表示循环移位前后操作数的符号是否有所变化。说明:2024年3月19日第97页32位数的移位:例:设32位数的高16位在DX中,低16位在AX中,将该数左移1次解决:如何把低16位中的最高位D15位移至高16位的最低位即D16位。CF0低高CF低高SALAX,1RCLDX,12024年3月19日第98页是用一条指令实现对内存区中连续存放的一串字符或数据的操作。⑴通过加重复前缀REP来实现串操作,重复循环次数由CX来决定,CX=0时不再重复;⑵可对字节串或字串进行操作;⑶串操作时,一般假定源串在DS中,用SI作指针对源串寻址;目的串在ES中,DI对目的串寻址;⑷串操作时,地址的修改决定于方向标志DF;当DF=0时,地址指针增量,即字节操作时地址指针加1,字操作时加2;DF=1时,地址指针减量。4、串操作指令2024年3月19日第99页串传送指令MOVS/MOVSB/MOVSW串操作指令串比较指令CMPS/CMPSB/CMPSW串扫描指令SCAS/SCASB/SCASW串装入指令LODS/LODSB/LODSW串存储指令STOS/STOSB/STOSW串指令前缀REP/REPE/REPNE2024年3月19日第100页1)字符串传送指令指令格式:MOVSOPRD1,OPRD2MOVSBMOVSW目的源功能:该类指令将一个字节或一个字从存储器的某个区域传送到另一个区域,然后根据DF自动修改地址指针。注:串操作指令的格式可写上操作数;也可只在后加上“B”(字节操作)或“W”(字操作),此时操作码后不允许写操作数。字节传送字传送2024年3月19日第101页例:将内存中BUF1为首址的100个字的数据搬到以BUF2为首址的内存中去。MOVSI,OFFSETBUF1MOVDI,OFFSETBUF2MOVCX,100AGAIN:MOVAX,[SI]MOVES:[DI],AXINCSIINCDIDECCXJNZAGAININCSIINCDI2024年3月19日第102页例:将内存中BUF1为首址的100个字的数据搬到以BUF2为首址的内存中去。MOVSI,OFFSETBUF1MOVDI,OFFSETBUF2MOVCX,100CLDREPMOVSBUF2,BUF1HLTREPMOVSWMOVCX,200REPMOVSBREP

当某条串指令需多次重复时,可加上该前缀,重复次数放在CX中。每重复执行一次,CX内容减1,直到CX=0为止。AGAIN:MOVSBDECCXJNZAGAIN

2024年3月19日第103页2)字符串比较指令指令格式:CMPSOPRD1,OPRD2CMPSBCMPSW目的源该类指令执行时,将当前DS段由SI所指的字节或字减去ES段中由DI所指的目的串的字节或字,并在比较之后修改地址指针,结果不送回只反映在标志位上。2024年3月19日第104页使用串比较指令的注意事项:将源字符串的首地址设置到DS段和SI寄存器中,目的字符串的首地址设置到ES段和DI寄存器中,比较的字节数或字数设置到CX中,并预置方向标志位,决定地址指针SI、DI的修改方向。CMPSB指令每执行一次,当DF=0时,SI、DI内容加1,CX减1;DF=1时,SI、DI内容减1,CX减1。

CMPSW指令每执行一次,当DF=0时,SI、DI内容加2,CX减1;DF=1时,SI、DI内容减2,CX减1。串比较指令可以有前缀REPE/REPZ或REPNE/REPNZ。2024年3月19日第105页例:比较两字符串,找出其中第一个不相等字符的地址。若两字符串全部相同,则转到ALLMATCH进行处理。两字符串长度均为20,首地址分别为STRING1和STRING2。REPE

相等重复指令前缀,只要ZF=1,且CX≠0,串指令就重复执行。LEASI,STRING1LEADI,STRING2MOVCX,20REPE

CMPSBJCXZALLMATCHDECSIDECDIHLTALLMATCH:MOVSI,0MOVDI,0HLTCLD

通过重复前缀的控制,可实现在两个字符串中寻找第一个不相等或相等的元素。2024年3月19日第106页例:检查内存首地址SOURCE和DEST两个100个字节串元素是否对应相等。若相等,BX=0;如不相等,则BX指向源串中第一个不相同字节的偏移地址,该字节内容保存在AL中。

MOVCX,100 LEASI,SOURCE LEADI,DESTAGAIN:CMPSB JNZNEXT DECCX JNZAGAIN MOVBX,0 JMPDONENEXT:DECSI MOVBX,SI MOVAL,[BX]DONE:HLT2024年3月19日第107页3)字符串扫描指令功能:用AL中的字节或AX中的字与内存中位于ES段DI寄存器指定单元的字或字节相比较。

使用该类指令时,字符串起始地址只放在ES:DI中,待查找的关键字必须放在AL或AX中。执行指令时,将AL或AX中的内容减去DI所指定的字节或字,但不改变操作数的值,只影响标志位。DI的值根据DF标志自动修改。指令格式:SCASOPRDSCASBSCASW目的2024年3月19日第108页

例:在某字符串长度为1000H字节,查找“$”字符。若存在,则将第一个“$”所在的地址送入BX中,否则将BX清零。CLDMOVDI,0100HMOVAL,’$’REPNE

SCASBANDCX,0FFFFHJZZERDECDIMOVBX,DIJMPSTOZER:MOVBX,0STO:HLTREPNE

不相等重复指令,只要ZF=0,且CX≠0,串扫描指令就重复执行。MOVCX,1000H2024年3月19日第109页指令格式:STOSOPRDSTOSBSTOSW4)取字符串指令字符串装入指令目的该类指令将由DS:SI

所指的源串字节或字逐个装入到AL或AX中。一般不带重复前缀。5)存字符串指令指令格式:LODSOPRDLODSBLODSW源字串存储指令

该类指令将AL或AX的内容存到ES:DI

所指的内存单元,并自动修改地址指针。2024年3月19日第110页例:LEADI,[0404H]CLDMOVCX,0080HXORAX,AXREPSTOSWHLT将0404H开始的256个单元清0。将“#”装入AREA为首址的100个字节中。LEADI,AREACLDMOVCX,100MOVAL,’#’HLTREPSTOSB2024年3月19日第111页串操作指令的重复前缀,操作数和地址指针指令重复前缀操作数地址指针MOVSREP目的,源ES:DI,DS:SICMPSREPE/REPNE源,目的DS:SI,ES:DISCASREPE/REPNE目的ES:DILODS无源DS:SISTOSREP目的ES:DI2024年3月19日第112页§3.2指令系统数据传送指令算术运算指令逻辑运算和位移指令串操作指令程序控制指令处理器控制指令P722024年3月19日第113页无条件转移、条件转移指令循环控制指令调用和返回指令软中断指令及中断返回指令5、程序控制指令2024年3月19日第114页1)无条件转移指令JMPOPRD直接转移间接转移SHORTNEARFAR段内段间目的地址由存储器或寄存器指出段内段间

JMP指令的操作是无条件地将程序转移到指令中规定的目标地址。2024年3月19日第115页2)条件转移指令JCCOPRD

条件转移指令是根据执行该指令时,标志寄存器中各标志位的状态,决定程序是否进行转移。所有的条件转移指令都是SHORT类型转移形式,不需加SHORT说明。即转移目标地址距当前IP值-128~+127字节范围内有效。标志条件转移指令CF、SF、OF、PF、ZF指令执行过程:⑴测试规定的条件;⑵若条件满足,则转移到目标地址,否则继续顺序执行。2024年3月19日第116页汇编格式操作测试条件有符号数比较JG/JNLEtarget大于ZF=0且SF=OFJGE/JNLtarget大于等于SF=OF或ZF=1JL/JNGEtarget小于SF≠OF且ZF=0JLE/JNGtarget小于等于SF≠OF或ZF=1无符号数比较JA/JNBEtarget高于CF=0且ZF=0JAE/JNBtarget高于等于CF=0或ZF=1JB/JNAEtarget低于CF=1且ZF=0JBE/JNAtarget低于等于CF=1或ZF=12024年3月19日第117页汇编格式操作测试条件JE/JZtarget等于ZF=1JNE/JNZtarget不等于ZF=0检测单个标志位JCtarget有进位CF=1JNCtarget无进位CF=0JOtarget溢出OF=1JNOtarget无溢出OF-0JP/JPEtarget校验为偶PF=1JNP/JPOtarget校验为奇PF=0JStarget负数SF=1JNStarget正数SF=02024年3月19日第118页例1:

设2000H开始的区域中,存放了14H个无符号数,要求找出其中最大的一个数,并存到3000H单元。MOVBX,2000HMOVAL,[BX]MOVCX,13HP1:INCBXCMPAL,[BX]JAEP2

MOVAL,[BX]JNZP1P2:DECCXMOVBX,3000HMOV[BX],AL2024年3月19日第119页例2:设2000H开始的区域中,存放了14H个带符号数,要求找出其中最大的一个数,并存到3000H单元。MOVBX,2000HMOVAL,[BX]MOVCX,13HP1:INCBXCMPAL,[BX]MOVAL,[BX]JNZP1P2:DECCXMOVBX,3000HMOV[BX],ALJGEP2

2024年3月19日第120页例3:编程计算Y=X结果放入bx中。MOVAX,XTESTAX,8000HJNSPPPP:MOVBX,AXNEGAXHLT2024年3月19日第121页3)循环控制指令

用来控制程序循环的指令,其控制转向的目标地址为当前IP内容的-128~+127范围内。该类指令用CX作计数器,先将CX内容减1,若满足循环条件,则转移到标号。指令格式循环条件LOOPtargetCX≠0LOOPE/LOOPZtargetCX≠0且ZF=0LOOPNE/LOOPNZtargetCX≠0且ZF=1JCXZtargetCX=02024年3月19日第122页例:MOVCX,1000NEXT:NOPLOOPNEXT设计一个延时子程序2024年3月19日第123页4)程序调用和返回指令调用指令CALL用来调用一个过程(子程序)。CALL指令也有段内和段间调用之分,这由被调用的过程决定,同时有直接和间接两种寻址方式。

调用指令在执行时,会把下一条指令的地址(段地址CS和指令指针IP)推入堆栈,这个地址叫返回地址。CALLNEARPTR过程名CALLFARPTR过程名过程名即为被调用的过程的首地址。2024年3月19日第124页返回指令RET

RET指令执行时,会将上一个CALL指令压入堆栈中的返回地址弹出,使程序返回到原来调用的地方。当调用的过程(子程序)结束后,可使用RET从调用的过程返回到调用它的程序中。

n是0~64K范围内任意偶数,用于移动堆栈指针。(SPSP+2(或+4)+n)带参数的返回指令:RETn2024年3月19日第125页5)中断指令

软中断指令

n是中断类型号,8位立即数,取值为00H~0FFH。INTn执行该指令时,将FLAGS、CS、IP依次推入堆栈,以保护断点状态,同时,将TF和IF清0,然后转向指定中断号的中断服务程序。中断服务程序的地址:将中断类型号n×4得到中断服务程序的入口地址(中断向量)。取第一个字放入IP,第二个字放入CS。2024年3月19日第126页类型号为0~4的中断为内部中断:0号中断:除数为零的中断,又称为溢出中断。在除法运算中遇到除数为0或有符号数除法运算的商超出规定范围时,由CPU自动产生的中断类型号为0的中断。1号中断:单步中断。当CPU检测到TF=1时,自动产生该类型的中断。2号中断:非屏蔽中断NMI。3号中断:断点中断。4号中断:溢出中断。相当于INTO指令,执行该指令时,CPU检测OF标志,当OF=1时,进入类型号为4的中断处理程序。该指令一般放在有符号数加、减运算后面,用以判断运算是否出错。2024年3月19日第127页

溢出中断指令INTO该指令检测溢出标志OF,若OF=1,则产生一个类型号为4的中断(执行一条INT4指令)。中断程序的入口地址在内存4×4=10H的两个字中。该指令一般放在有符号数加、碱运算的后面,用以判断是否产生运算错误。

中断返回指令IRET本指令用于中断处理程序结束时,返回原程序的断点处。指令将弹出原标志寄存器的值和断点地址,返回到原来被中断的程序。(恢复断点)2024年3月19日第128页STC

置进位标志,使CF=1CLC

清进位标志,使CF=0CMC

进位标志求反STD

置方向标志,使DF=1CLD

清方向标志,使DF=0STI

开中断标志,使IF=1CLI

关中断标志,使IF=0HLT

使CPU处于停止状态,直到重启或产生中断。WAIT

使处理器当TEST=1时,处于等待状态。ESC

使协处理器可从8088指令流中取得它的指令。LOCK

封锁总线指令(前缀),封锁总线控制权。

NOP

空操作指令,影响指令指针。标志位操作指令外部同步指令6、处理器控制指令2024年3月19日第129页系统功能调用——由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INTn来实现。在DOS系统中,功能调用都是用软中断指令INT21H来实现的。§3.3系统功能调用2024年3月19日第130页INT2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它。D0S系统功能调用的使用方法如下:① AH←功能号;② 设置该功能所要求的其他入口参数;③ 执行INT21H指令;分析出口参数。2024年3月19日第131页

温馨提示

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

评论

0/150

提交评论