微机原理与接口技术(徐惠民主编)--第3章.ppt.ppt_第1页
微机原理与接口技术(徐惠民主编)--第3章.ppt.ppt_第2页
微机原理与接口技术(徐惠民主编)--第3章.ppt.ppt_第3页
微机原理与接口技术(徐惠民主编)--第3章.ppt.ppt_第4页
微机原理与接口技术(徐惠民主编)--第3章.ppt.ppt_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

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

文档简介

第三章8086/8088指令系统1.18086/8088寻址方式1.28086/8088指令系统,指令及指令集计算机能够识别和执行的基本操作命令,指令的作用,告诉cpu干什么?what?告诉cpu从哪儿取数据?where?告诉cpu下一条指令在哪儿?where?,指令的格式,101110110011010000010010,指令的数量,数值计算信息处理多媒体,指令数量取决于cpu的功能,80x86cpu指令数量,8086:133条整数运算输入输出程序控制扩充:多媒体指令浮点运算指令cache处理指令,指令系统(cisc复杂与risc精简),指令数量影响:,程序的执行速度cpu的复杂程度,指令的通用格式标号:指令助记符操作数1,操作数2;注释,80x86指令在内存的存放形式,80x86的指令操作码和操作数由一或多个字节(8位)组成二进制与助记符(把十六进制数1234送cpu的bx寄存器)双操作数:操作码目的操作数,源操作数,低字节在前(34h)高字节在后(12h),指令的助记符格式,标号:指明指令所在地址。操作码:用来说明该指令所要完成的操作。操作数1:称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果。操作数2:常被称为源操作数src,它表示参与指令操作的一个对象。注释:分号后的内容是对指令的解释。,标号:操作码操作数1,操作数2;注释,操作数类型按操作数在指令中的所起的作用,可以分为目的操作数:不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果源操作数:表示参与指令操作的一个对象按操作数的存储位置分,可以分为立即数。就是在指令中直接给出常数。寄存器操作数。其书写形式就是寄存器名。存储器操作数。其书写形式是存储单元的逻辑地址。,指令的操作码和操作数,每种指令的操作码:用一个助记符表示(指令功能的英文缩写)对应着机器指令的一个或多个二进制编码指令中的操作数:可以是一个具体的数值可以是存放数据的寄存器或指明数据在主存位置的存储器地址,3.18086/8088寻址方式,指令系统设计了多种操作数的来源寻找操作数的过程就是操作数的寻址把寻找操作数的方式叫做(操作数)寻址方式理解操作数的寻址方式是理解指令功能的前提操作数采取哪一种寻址方式一方面,会影响处理器执行指令的速度和效率另一方面,对程序设计也很重要,mov指令的功能,3.1.1立即数寻址方式,指令中的源操作数为常数,称为立即数寻址.立即数寻址方式常用来给寄存器赋值,多以常量形式出现,movax,0102h;ax0102h,例:movax,1c8fhmovbyteptr2a00h,8fh错误例:mov2a00h,ax;错误!,注:立即数不能作目的操作数。以af打头的数字,前面要加一个0,如movax,0ff00h,立即数寻址方式,3.1.2寄存器寻址方式,操作数存放在cpu的内部寄存器中。源操作数与目的操作数字长要相同不允许将立即数传送到段寄存器,movax,bx;axbx,例:movax,bxmovcl,al错误例:movax,bl;字长不同,注意:源、目的操作数的长度一致,3.1.3直接寻址,直接寻址方式的有效地址在指令中直接给出用中括号包含有效地址,表达存储单元的内容默认的段地址在ds段寄存器,可使用段超越前缀改变。偏移地址也可用符号地址来表示,如addr、var,movax,2000h;axds:2000h,movax,2a00hmovdx,es:2a00hmoves:2a00h,dxmovsi,table_ptr,例movax,1000h;若ds=2000h,(21000h)=32h,(21001h)=45h,功能:是将一个有效地址是1000h的存储单元的内容传送到ax。该存储单元的物理地址为:pa=2000h*10h+1000h=20000h+1000h=21000h指令执行结果为:ax=4532h。,3.1.4寄存器间接寻址方式,操作数的偏移地址放在间址寄存器中。只有si、di、bx和bp可作间址寄存器。,1)以si、di、bx间址寻址时,操作数在数据段(ds)区域中,即:dx*10h+(si、di、bx)中的偏移量=操作数物理地址。2)以bp间址寻址时,操作数在堆栈段(ss)区域中,即:ss*10h+(bp)中的偏移量=操作数物理地址。,1选择si、di、bx作为间址寄存器操作数在数据段(没有使用段超越时)movax,di若已知(ds)=5000h,(di)=1600h,则操作数的物理地址为:5000h10h+1600h=51600h执行的结果为(ax)=789ah,2选择bp作为间址寄存器操作数在堆栈段movbp,ax若已知(ss)=6000h,(bp)=1500h,则操作数的物理地址为:6000h10h+1500h=61500h若已知(ax)=5566h,则指令的执行结果为:66h送到61500h内存单元,55h送到61501h内存单元,3.1.5变址寻址以指定的寄存器内容,加上指令中给出的8位或16位位移量(必须要以一个段寄存器作为基地址),作为操作数的地址。作为变址寻址的寄存器可以是si、di、bx、bp四个寄存器中的任一个.若用si、di和bx作为变址寄存器,操作数在数据段,即段地址在ds寄存器;若用bp变址,则操作数在堆栈段,即段地址在ss寄存器例:movax,2000hsi若(si)=1200h,(ds)=1500h,则操作数的地址为18200h,movax,si+06h;axds:si+06h,movax,06hsi;axds:si+06h,3.1.6基址-变址相对寻址方式这种寻址方式的有效地址是一个基址寄存器内容和一个变址寄存器内容与由指令中指定的8位或16位偏移量之和。,(1)若用bx作为基地址,则操作数在数据段中。ds10h+bx+(si/di)+(disp8/disp16)(2)若用bp作为基地址,则操作数在堆栈段中。ss10h+bp+(si/di)+(disp8/disp16)例movax,bx+si+4500h若ds=3000h,bx=2000h,si=1000h,(37500h)=56h,(37501h)=12h,指令执行情况如图所示,执行结果为:ax=1256h。,基址加变址相对寻址方式也可以表示成几种不同的形式,其中count为位移量。movax,bx+si+countmovax,countbxsimovax,bx+countsimovax,bxcountsimovax,bx+sicountmovax,countsibx注意:上述寻址方式中,除立即寻址和寄存器寻址外,其它寻址方式的操作数都是通过访问存储器取得,对这几种寻址方式的段寄存器的使用情况如下:(1)若不指出段基址,80868088会采用默认的段寄存器。规则为:偏移量表达式出现bp则使用ss;否则使用ds。(2)可以用“段寄存器名:”的形式指出段基址,此时默认规则不再起作用。如:“movax,ds:bp”中段基址采用ds值,而不是默认的ss的值。在这里将“ds:”称为段超越或段前缀,它超越了默认的访问段。,注意,1.区别立即数寻址和直接寻址movax,126movax,1262.区别寄存器寻址和寄存器间接寻址movax,bxmovax,bx3.双操作数指令中,不能同为存储器操作数。4.cs不能为目的寄存器。,3.28086/8088指令系统,数据传送(datatransfer)算术运算(arithmetic)逻辑运算和移位(logic)串操作(stringmanipulation)控制转移(controltransfer)处理器控制(processorcontrol),1.通用数据传送指令一般传送指令mov堆栈操作指令push和pop交换指令xchg查表转移指令xlat字位扩展指令,3.2.1数据传送指令,(1)数据传送指令格式:movopd,ops操作:opdops说明:mov指令将源操作数ops的内容传送到目的地opd。指令执行后opd与ops的内容相等,即opd=ops,源操作数本身不变。,cpu内部寄存器之间数据的任意传送(除了代码段寄存器cs和指令指针ip以外)。moval,bl;字节传送movcx,bx;字传送movds,bx,立即数传送至cpu内部的通用寄存器组(即ax、bx、cx、dx、bp、sp、si、di)movcl,4movax,03ffhmovsi,057bhcpu内部寄存器与存储器之间的数据传送。moval,2000hmovax,simovdi,cxmovsi,blockbpmovds,datasi+bxmovdestbp+di,es,能实现用立即数给存储单元赋值movbyteptr2000h,25hmovwordptrsi,35h注意:byteptr指字节单元;wordptr指字单元,对于mov指令应注意几个问题:mov传送指令中,不允许对cs和ip进行操作;两个存储器操作数之间不允许直接进行信息传送;若要将2000h单元的内容,传送至同一段的3000h单元中去,mov指令不能直接完成这样的传送,必须借助寄存器来完成传送:moval,2000h;mov3000h,al,两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;(x)movds,100h;(x)movds,es;目的操作数,不能用立即寻址方式。mov指令不影响标志位,2.堆栈操作指令。堆栈:按后进先出的原则组织的内存区域即堆栈段。用ss指示段地址。堆栈指针sp总是指向栈顶(最后压入的数的地址)。sp的初值规定了所用堆栈的大小(堆栈的深度),一个栈的深度最大为64kb。堆栈用途:临时存放数据、传递参数、保存和恢复寄存器堆栈指令:入栈和出栈,1)入栈指令格式:pushops操作:spsp-2,sp+1spops操作数类型:ops可以是存储器、通用寄存器和段寄存器,但不能是立即数。说明:push指令先将sp的内容减2,然后再将操作数ops的内容送入由sp指出的栈顶即偏移地址为sp和sp+1的两个连续字节中。例10pushax;通用寄存器内容入栈pushcs;段寄存器内容入栈pushsi;字存储单元内容入栈,2)出栈指令格式:popopd操作:opdsp+1sp,spsp+2操作数类型:opd可以是存储器、通用寄存器或段寄存器(但不能是cs),同样,不能是立即数。说明:pop指令先将堆栈指针sp所指示的栈顶存储单元的值弹出到操作数opd中,然后再将sp的内容加2。入栈和出栈操作如图所示。,例:popax;栈顶内容弹出至通用寄存器popes;栈顶内容弹出段寄存器popmemdi;栈顶内容弹出至字存储单元,(3)数据交换指令格式:xchgopd,ops操作:opdops操作数类型:可以是寄存器或存储器,但不能二者同时为存储器。说明:xchg指令将两个操作数内容进行交换。交换的内容可以是一个字节(8位),也可以是一个字(16位),两个操作数的长度必须一致。(段寄存器不能参加交换)例xchgal,cl;8位寄存器间内容交换xchgax,dx;16位寄存器间内容交换xchgbx,datasi;寄存器与存储单元间交换,4累加器专用传送指令输入输出指令in,out输入输出指令完成外设与cpu之间的数据传送。输入指令in用于从外设端口接收数据,输出指令out则向端口发送数据。in指令一般格式:inal,n;alninax,n;axn+1ninal,dx;aldxinax,dx;axdx+1dx功能:从i/o端口输入数据至al或ax.输入指令允许把一个字节或一个字由一个输入端口传送到al或ax中。,输出指令格式:outport,al/ax操作:(port)al/ax操作数类型:同输入指令说明:将累加器al(8位)或ax(16位)的内容输出到指令指定的i/o端口中。注意:输入输出指令不影响标志位例out40h,al;(40h)alout20h,ax;(21h,20hax)outdx,al;(dx)aloutdx,ax;(dx1,dx)ax,(2)查表转换指令格式:xlat功能:完成一个字节的查表转换:al=(ds)16(bx)+(al)要求:寄存器al的内容作为一个256字节的表的下标;表的基地址在bx中,转换后的结果存放在al中。,例:设(ds)=a000h,(bx)=0010h,表的起始地址为a0010h,表中放数字0-9的ascii码movbx,0010hmoval,06hxlat执行该程序后,(al)=36h本指令可用在数制转换、函数表查表、代码转换等场合。,a000:0010,30h,31h,a000:0016,36h,3地址传送指令(1)有效地址送寄存器指令格式:leareg,ops操作数类型:ops为存储器操作数,reg为16位通用寄存器。说明:将源操作数ops的有效地址即16位偏移地址装入到16位通用寄存器reg中。,例设ds=3000h,bx=2000h,si=1000h,leaax,bx+si+1000h执行的结果是:ax=bx+si+1000h=4000h区别:movax,bx+si+1000h指令是将偏移地址为bx+si+1000h的内存单元的内容送到ax中,结果是ax=1256h。,例ldssi,0100h设:原来ds=3000h,(30100h)=60h,(30101h)=05h,(30102h)=18h,(30103h)=20h,上述指令执行后,si=0560h,ds=2018h,执行过程如图3-11所示。,(2)地址指针装入ds指令格式:ldsreg,ops操作数类型:ops为存储器操作数,reg为16位通用寄存器。说明:将ops指定的内存中读取双字存储单元内容,将其中的低字的内容赋给reg,高字内容传赋给ds。,(3)地址指针装入es指令格式:lesreg,ops操作数类型:ops为存储器操作数,reg为16位通用寄存器。这条指令除将地址指针的段地址部分送入es外,与lds类似。例如:lesdi,bx,6.标志传送指令指令格式:lahf;ahflags的低8位sahf;flags的低8位ah说明:lahf和sahf指令隐含的操作数为ah寄存器和标志寄存器flags的低半字节。涉及标志寄存器flags中的5个状态标志位为sf、zf、af、pf以及cf。,(2)标志入、出栈指令指令格式:pushf;spsp-2,sp+1spflagspopf;flagssp+1sp,spsp+2这两条指令可以用来修改标志寄存器中标志位的值。此指令不影响标志位。,3.2.2算术运算指令,算术运算类指令用来执行二进制的算术运算:加、减、乘、除。这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志重点掌握加法指令:add、adc、inc减法指令:sub、sbb、dec、cmp、neg,加法和减法指令,加法指令:add,adc和inc减法指令:sub,sbb,dec,neg和cmp他们分别执行字或字节的加法和减法运算,除inc和dec不影响cf标志外,其他按定义影响全部状态标志位,1加法指令(1)加法指令格式:addopd,ops操作:opdopd+ops说明:add指令将opd与ops相加,并将结果存回opd。加法指令影响全部6个状态标志位。操作数类型:opd可以是寄存器或存储器,ops可以是寄存器、存储器或立即数。但是ops和opd不能同时为存储器。另外,opd、ops不能为段寄存器。(段寄存器不能参加、减、乘、除运算)。具体操作数组合见表3-1,适合加、减、乘、除运算。,表3-1加、减、乘、除运算操作数类型组合,例:addal,20;累加器内容与立即数相加adddx,si;寄存器内容相加addax,bx;寄存器与存储器内容相加adddatadi,aladdbyteptrbpsi,50h;存储器内容与立即数相加,例题1加法,movax,7348h;ax7348haddal,27h;al48h27h6fh,ax736fh;of0,sf0,zf0,pf1,cf0addax,3fffh;ax736fh3fffhb36eh;of1,sf1,zf0,pf0,cf0,(2)带进位加法指令格式:adcopd,ops操作:opdopd+ops+cf说明:adc指令与add指令有些相似,但是它将opd与ops相加时,同时还要加上进位标志cf的内容,然后将结果送回opd。adc指令也将根据运算结果修改状态标志位。带进位加法指令主要用于数据位数较长、需要分段运算的加法运算。在进行多字加法运算时,低位字用add指令相加,高位用adc指令相加,以接受低位产生的进位。,例2计算两个四字节长整数之和,数na=7a546c08h,nb=12f0497dh,求na+nb。分析:这是两个32位二进制数的加法,add指令一次只能完成两个16位二进制数的加法,32位数的加法要分两次进行:用add指令先加低16位,低16位产生的cf值,通过高16位adc指令加进去,以保证结果的正确。解:movbx,6c08h;取加数的低字addbx,497dh;和另一个加数的相应字相加movax,7a54h;取加数的高字adcax,12f0h;和另一个加数的相应字相加程序段的运行结果:ax中为和的高字,bx中为和的低字。,(3)加1指令格式:incopd操作:opdopd+1说明:inc指令将opd加1。注意:指令可以是寄存器或存储器,但不能是段寄存器和立即数。inc指令常常用于循环程序中修改地址或者进行加法计数。例incsi;将si寄存器内容加1incbyteptrbx;将存储器字节单元bx内容加1incwordptrsi;将存储器字单元si内容加1,2减法指令(1)减法指令格式:subopd,ops操作:opdopd-ops说明:sub指令用opd减去ops,结果送回opd。sub指令对状态标志位有影响。对操作数类型组合的要求与加法指令相同,见表3-1。(2)带借位减法指令格式:sbbopd,ops操作:opdopdopscf说明:sbb指令将opd减去ops,同时减进位标志cf,并将结果送回opd。该指令主要用于多字节数的分段减法。sbb指令对标志位的影响与sub指令相同。sbb指令中操作数的类型组合也与sub指令相同。,例3:subsi+14h,0136h执行前:(ds)=3000h,(si)=0040h,(30054h)=4336h执行后:(30054h)=4200h,sf=0,zf=0,cf=0,of=0,例4:sbbsi+14h,0136h执行前:(ds)=3000h,(si)=0040h,(30054h)=4336h,cf=1执行后:(30054h)=41ffh,(3)减1指令格式:decopd操作:opdopd-1说明:dec指令使opd减1例deccx;寄存器内容减1decbyteptrdi;存储单元内容减1(4)求补指令格式:negopd操作:opd0-opd说明:neg指令使操作数求补,即用“0”减去opd,结果送回opd。,(5)比较指令格式:cmpopd,ops操作:opd-ops说明:,不保存结果,只影响标志位,用于转移,判断相等:用zf标志,1表示相等,判断大小,有符号数:用sf与of的异或结果。1表示小于,无符号数:用cf标志。1表示小于,例:cmpal,100cmpdx,di比较指令主要用于比较两个数之间的关系。在比较指令之后,根据zf标志即可判断两者是否相等。,相等的比较:若两者相等,相减以后结果为零,zf标志为1,否则为0。若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。大小的比较:如果是两个无符号数(如cmpax,bx)进行比较,则可以根据cf标志的状态判断两数大小。若结果没有产生借位(cf=0),显然axbx;若产生了借位(即cf1),则axbx。,大小的比较:如果是两个符号数(如cmpax,bx)进行比较,则可以根据of标志与sf标志的状态判断两数大小。若结果的of与sf的值相同,则axbx;反之,则axbx。,例4:判断寄存器ax与bx的内容是否相等,若相等,使dx=1,否则,使dx=0。解:程序如下:cmpax,bx;比较ax与bx的内容jzequal;相等,转equalmovdx,0;不等,向dx送0jmpnextequal:movdx,1;向dx送1next:hlt,说明:乘法指令中只列出ops,opd是隐含的。两条指令的功能是一样的,但是对同样的数其运算结果是不同的。,3乘法指令乘法指令有两条,分别用于无符号数和符号数的乘法。格式:mulops;无符号数乘法imulops;带符号数乘法,操作:字节乘法:axalops字乘法:(dx,ax)axops操作数:ops可以是寄存器或存储器,opd只能是al/ax,影响标志,隐含寄存器,moval,20hmovbl,10hmulbl,结果默认为(dx)(ax)或(ax),乘数默认为ax或al,of、cf,结果超过16位或32位时,cf(of)=1,4除法指令格式:divops;无符号数除法idivops;带符号数除法操作:字节除法:alax/ops的商;ahax/ops的余数做字除法:ax(dx,ax)/ops的商dx(dx,ax)/ops的余数说明:除法规定:除数只能是被除数的一半字长。当被除数为16位时,除数应为8位;被除数为32位时,除数应为16位。被除数为16位时,应存放在ax中。被除数为32位时,应存放在dx(高位)和ax(低位)中。,隐含寄存器,movax,1234hmovbl,21hdivbl,商默认为(al)或(ax),被除数默认为(ax)或(dx)(ax),余数默认为(ah)或(dx),被0除,停止继续执行,产生0号中断,显示“被零除”信息,4.2符号扩展指令(1)字节扩展指令格式:cbw操作:把al中的符号扩展到ah。如果al80h,则ah00h,否则ah0ffh。(2)字扩展指令格式:cwd操作:把ax的符号扩展到dx。如果ax8000h,则dx0000h,否则dx0ffffh。注意:上述两条指令仅限于将扩展数放在al或ax中进行。,例若al=100,bl=15,试编写程序段,求出al除以bl的商和余数分别存放在dl和dh中。解:程序如下:cbw;字节扩展到字divbl;除法movdl,al;存商movdh,ah;存余数hlt,5十进制数(bcd码)运算调整指令bcd码有两类:压缩bcd码:就是通常的8421码;非压缩bcd码:用8个二进制位表示一个十进制位bcd码运算时,应分两步进行:(1)先按二进制数运算规则进行运算,得到中间结果。(2)用十进制调整指令对结果进行修正,得到运算结果。注意:bcd码的运算只能在8位累加器al中进行;十进制数的乘、除运算只能用非压缩的bcd格式;除法运算时,应先调整,后运算。,(1)压缩型bcd码调整指令格式:daa;加法调整das;减法调整说明:将加法(add或adc)或减法(sub或sbc)运算的结果(在al寄存器中)调整为压缩bcd码。(2)非压缩型bcd码调整指令、加减法调整格式:aaa;加法调整aas;减法调整说明:将加法(add或adc)或减法(sub或sbc)运算的结果(在al寄存器中)调整为非压缩bcd码。调整后的al寄存器中高4位被清0,如有进位或借位,则在ah中。,、乘法调整格式:aam说明:把al中的数值调整为非压缩bcd码,并存入ax中。、除法调整格式:aad操作:alah10+al,ah0说明:将ah寄存器的内容乘以10并加上al寄存器的内容,结果送回al,同时将ah清0。其操作实质是将ax寄存器中的非压缩bcd码转换成二进制数,存放在al中。,7+5=12用组合的bcd码表示运算过程:,16进制加法,aaa指令调整为10进制结果,bcd码逢十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时af=1,cf=1。,3.2.3逻辑运算和移位指令,1逻辑运算指令(1)逻辑“非”运算,对一个操作数执行逻辑非运算,notoprd;oprdoprd,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,对两个操作数执行逻辑与运算,结果送目的操作数,andopd1,opd2;opd1opd1opd2,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,(2)逻辑“与”运算,对两个操作数执行逻辑或运算,结果送目的操作数,oroprd1,oprd2;oprd1oprd1oprd2,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,(3)逻辑“或”运算,对两个操作数执行逻辑异或运算,结果送目的操作数,xoroprd1,oprd1;oprd1oprd1oprd1,只有相“异或”的两位不相同,结果才是1;否则,结果为0,(4)逻辑“异或”运算,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按and指令影响标志,testoprd1,oprd1;oprd1oprd1,and与test指令的关系,同sub与cmp指令的关系一样,(5)逻辑测试指令,testal,01hjnzp1,;检验al最低位是否为1,例逻辑运算指令的应用,andbl,11110110b;bl中d0和d3清0,其余位不变orbl,00001001b;bl中d0和d3置1,其余位不变xorbl,00001001b;bl中d0和d3求反,其余位不变,and指令可用于复位某些位(同0相与),不影响其他位,or指令可用于置位某些位(同1相或),不影响其他位,xor指令可用于求反某些位(同1相异或),不影响其他位,2移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:该操作数为1,表示移动一位该操作数为cl,cl寄存器值表示移位位数(移位位数大于1只能cl表示)按照移入的位设置进位标志cf,根据移位后的结果影响sf、zf、pf,(1)逻辑左移/算术左移指令格式:shlopd,m;逻辑左移指令salopd,m;算术左移指令操作:如图所示。,说明:左移1位时,相当于无符号数乘上2。例shlah,1;ah内容左移1位movcl,3salsi,cl;si内容左移3位,(2)逻辑右移指令格式:shropd,mt操作:如图所示。说明:shr指令将opd顺序向右移1位或移cl寄存器中指定的位数。无符号数右移1位相当于除以2。例movbl,20h;bl=20hshrbl,1;bl=10h,(3)算术右移指令格式:saropd,m操作:如图3-17所示。说明:算术右移一位相当于将该数除以2。例saral,1sardi,cl,(4)循环移位指令roloprd,m;左循环移位roroprd,m;右循环移位rcloprd,m;带进位左循环移位rcroprd,m;带进位右循环移位,前两条循环指令,未把标志位cf包含在循环的环中,后两条把标志位cf包含在循环的环中,相当于9位循环。循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以循环移位一次,也可由cl的内容所决定的次数。左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2右移位相当于除以2.,利用循环移位指令可以对寄存器/存储器中进行测试。例测试al寄存器中第5位的状态,为“0”时转向zero,否则向下继续执行。(用循环移位指令实现)movcl,6roral,cl;将al的bit5移入cfjnczero;若cf=0,则转向zero处;否则,继续执行zero:,3.2.4串操作指令,串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。源操作数用寄存器si寻址,默认在数据段ds中。目的操作数用寄存器di寻址,默认在附加段es中。字串长度默认在cx中,存取或搜索的值默认在al中。每执行一次串操作指令,si和di将自动修改:1(对于字节串)或2(对于字串)执行指令cld指令后,df=0,地址指针增1或2执行指令std指令后,df=1,地址指针减1或2,重复指令前缀串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见下表:,1串传送指令格式:movs目的串,源串;一般格式movsb;字节格式movsw;字格式操作:es:dids:sisisi1,didi1(字节操作)或sisi2,didi2(字操作)说明:movs指令将由ds:si作为指针的源串中的一个字节或字内容传送到由es:di为指针的目的串单元中,然后自动修改地址指针,指向下一字节/字。movs指令可与重复前缀rep联用,实现整个数据块的传送。,例:在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中。其中源串存放在数据段中从符号地址mess1开始的存储区域内,每个字符占一个字节;mess2为附加段中用以存放字符串区域的首地址。leasi,mess1;置源串偏移地址leadi,mess2;置目的串偏移地址movcx,17;置串长度cld;方向标志复位repmovsb;字符串传送,2串比较指令格式:cmps源串,目的串;一般格式cmpsb;字节串比较cmpsw;字串比较操作:ds:si-es:disisi1,didi1(字节操作)或sisi2,didi2(字操作)说明:将由si作为指针的源串中的一个字节或字与由di为指针的目的串的相应元素相比较(源串减目的串,结果不送回目的串,但影响标志位),然后自动修改地址指针,指向下一元素。,例试比较两个长度为n的字符串str1和str2是否相等。若相等,置dl=1。否则,dl=0。解:比较两字符串相等可采用对应字符逐个比较的方法。leasi,str1leadi,str2movcx,ncldrepzcmpsb;未到串尾且对应字符相等时,继续比较jnznoeq;若串不等,转noeqmovdl,1;若串相等,dl=1jmpnextnoeq:movdl,0;串不等,dl=0next:hlt,3.串扫描指令格式:scas目的串scasb;字节操作scasw;字操作操作:al/ax-es:dididi1(字节操作)或didi2(字操作)说明:将al或ax的内容减去由di作为指针的目的串元素,结果影响标志位,但累加器及目的串的内容不变。注意:搜索到关键字后,di内是该字符的下一个字符的地址。,例:在附加段中有一个字符串,存放在以符号地址mess2开始的区域中,长度为17,要求在该字符串中搜索空格符(ascii码为20h)。实现上述功能的程序段如下:leadi,mess2;装入目的串偏移地址moval,20h;装入关键字节movcx,17;装入字符串长度cldrepnescasb该程序段执行之后,di的内容即为相匹配字符的下一个字符的地址,cx中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字),则当查完之后(cx)0退出重复操作状态。,4.串存储指令格式:stos目的串stosb;字节操作stosw;字操作功能:把指令中指定的一个字节/字,传送到附加段中由di间接寻址的字节/字内存单元中去,然后,根据方向标志df及所进行操作的数据类型(字节或字)对di进行修改操作。在指令重复前缀的控制下,可连续将al(ax)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。,例:要对附加段中从mess2开始的5个连续的内存字节单元进行清0操作可用下列程序段实现:leadi,mess2;装入目的区域偏移地址moval,00h;为清零操作准备movcx,5;设置区域长度cldrepstosb,5.串装入指令格式:lods源串;一般格式lodsb;字节操作lodsw;字操作操作:al/axds:sisisi1(字节操作)或sisi2(字操作)说明:将由si作为指针的源串元素传送到al(字节操作)或ax(字操作),然后自动修改指针,指向下一元素。lods指令一般不用重复前缀。,3.2.5程序控制指令,控制转移类指令用于实现程序分支、循环、过程等程序结构,是仅次于传送指令的最常用指令。控制程序流向的指令分别为:转移指令、循环控制指令、过程调用指令和中断指令。控制转移类指令通过改变ip(和cs)值,实现程序执行顺序的改变。,1无条件转移指令使程序无条件地跳转到指令中指定的目的地址去执行。格式:jmp(1)直接转移格式:jmp目标标号操作:ipip+disp16(目标标号所在处的偏移量)说明:该指令将当前ip的内容加上disp16,代码段寄存器cs的内容不变,从而使控制转移到本程序段内的一个目的地址。相对位移量可正可负,其范围在-32768+32767之间。,例movax,bxjmpnext;转到next处执行next:movax,0,(2)段内直接短转移格式:jmpshort目标标号操作:ipip+disp8说明:与段内直接转移类似,只是指令转移的相对位移量用8位二进制表示,范围在-128+127之间。(3)段内间接转移格式:jmp字地址指针操作:ipea说明:指令中的操作数可以是一个16位的寄存器或字存储单元地址。指令用指定的寄存器或存储单元的内容作为转移目标的偏移地址ea取代原来ip的内容,以实现程序的转移。由于是段内转移,cs寄存器的内容不变。,例jmpax;ipaxjmpbx;ipbx+1bx,(4)段间直接转移格式:jmp目标标号操作:ipoffset目标标号csseg目标标号说明:目标标号是其他程序段内的一个标号。指令将目标标号的偏移地址取代ip的内容,同时将目标标号的段基址装入cs(seg是取段基址操作符)。(5)段间间接转移格式:jmp双字地址指针操作:ipeacsea+2说明:指令中的操作数是一个32位的双字存储单元。指令将存储单元前两个字节内容送到ip寄存器,后两个字节内容送到cs寄存器,以实现向另一代码段的转移。,2.条件转移指令:8086/8088有18条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(cs)内,并且以当前指针寄存器ip内容为基准,其位移必须在十127-128的范围之内:一个8位位移量(带符号数),表示本条件转移指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移;8位位移量是相对于当前ip的,且距当前ip地址128127个单元的范围之内,属于段内短距离转移。条件转移指令不影响标志,但要利用标志。,(1)根据单个标志位的条件转移指令,例根据某一字节带符号数x是正、是零还是负使程序分别转移至标号为plus、zero、minus处执行:moval,x;alxoral,al;al不变,但影响状态标志位jsminus;x为负,转向minusjzzreo;x为零,转向zeroplus:;x为正时的处理程序段minus:;x为负时的处理程序段zero:;x为零时的处理程序段注意:条件转移指令的目标标号必须是一个近标号,即目标地址到转移指令必须在-128+127的范围内。这些指令不影响标志位,(2)根据复合标志位的条件转移指令,说明:这类指令主要用于判断两个数的大小,根据相比较的数是无符号数还是带符号数而采用不同的复合标志位作为判断条件。,(3)根据两数比较结果的条件转移指令,说明:比较两个数的大小时,既可选基于单个标志位的条件转移指令,又可根据数的特点选用有符合数或无符号数专用的比较转移指令,判断之前应先用比较指令做一次减法,设两数在ax与bx内,即:“cmpax,bx”,然后再选择条件转移指令。,测试转移指令,jcxzoprd:cx=0时转移,这一条指令主要与循环控制指令(loop)混合使用,以实现程序中的循环结构。因为循环指令中使用cx寄存器作为计数器实现计数循环,但loop指令不允许cx的初始值为零,所以往往使用此指令放在循环指令前。例:jcxzoutjmploop,3子程序调用和返回指令若需要在不同的地方多次反复使用,则可以将这些程序段设计成为子程序,在需要时进行调用。调用子程序后,控制便转移到该子过程,执行子程序中的指令。子程序执行完后,控制又返回到调用处。,(1)子程序调用指令:call执行call指令时,先将主程序的返回地址(call指令的下一条指令的地址)压入堆栈,然后转移到被调用的子程序处。,子程序有近程和远程两类。近程子程序只能被同一代码段内的程序所调用(段内调用);远程子程序可以被本代码段,也可以被其他代码段的程序所调用(段间调用),1)段内直接调用格式:call子程序名操作:ip入栈说明:被调用过程是一个近过程,在本代码段内。call指令将ip(返回地址)压入堆栈,然后将call的下一条指令与被调用过程入口地址之间的16位相对位移量disp16加到ip上,使控制转到被调用的过程。,2)段内间接调用格式:call字地址指针操作:spsp-2,sp+1spip,ipea说明:指令中的操作数是一个16位的寄存器或字存储单元,其中的内容是一个近过程的入口地址。call指令将返回地址ip压入堆栈,然后将寄存器或字存储单元的内容作为有效地址装入ip。,3)段间直接调用格式:callfarptr过程名4)段间间接调用格式:call双字地址指针,(2)返回指令子过程执行的最后一条指令必须是返回指令,用于返回到调用该子程序的断点处。1)返回指令格式:ret2)带弹出值的返回指令格式:retpop_value操作:先执行与ret相同的操作,再修改sp。说明:弹出值应为一个16位立即数,通常是偶数。弹出值表示返回时从堆栈中舍弃的字节数。例如:ret4,返回时舍弃堆栈中的4个字节。,4循环控制指令程序中常常要重复执行一些程序段,形成循环。是否要重复执行某段程序是有条件的,或满足某一条件时结束循环。循环转移指令控制转移的距离在

温馨提示

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

评论

0/150

提交评论