《第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt》由会员分享,可在线阅读,更多相关《第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 Win32汇编语汇编语言言-汇编语言程序设计汇编语言程序设计基础基础-指令系统指令系统主要内容nIA-32通用指令集数据传送类指令算术运算类指令位操作类指令串操作类指令控制转移类指令处理机控制类指令其他类2022/10/152IA-32指令系统n计算机的指令系统是指计算机能够执行的全部指令的集合。nIA-32CPU指令系统包括:通用指令浮点运算指令SIMD指令MMX指令(多媒体扩展指令集)SSE/SSE2/SSE3指令(单指令多数据流扩展)系统指令64位模式的指令2022/10/153通用指令集合数据传送类指令算术运算类指令位操作类指令串操作类指令控制转移类指令处理机控制类指令其
2、他类2022/10/154汇编指令格式target:movcount,ebx;EBXtarget:movcount,ebx;EBX送变量到送变量到countcountn标号:指令在主存中的逻辑地址n指令助记符:指令的名称n操作数:表示参与指令操作的对象个数可以是0/1/2/3,多个操作数之间以逗号(,)隔开。存放操作结果的操作数叫做目的操作数,一般是指令中的第一个操作数参与操作的其他操作数叫做源操作数n注释:增加可读性。标号:指令助记符操作数列表;注释2022/10/155操作数n操作数类型imm立即操作数reg寄存器操作数mem内存操作数n操作数的寻址方式立即数寻址寄存器寻址存储器寻址202
3、2/10/156数据传送指令n数据传送是计算机中最基本、最重要的一种操作n传送指令也是最常使用的一类指令n传送指令把数据从一个位置传送到另一个位置n除标志寄存器传送指令外,均不影响标志位n重点掌握MOVXCHGPUSHPOPLEA2022/10/157MOV指令nMOV指令是一个数据传送指令,其格式为:nMOV指令的功能是从源操作数src向目的操作数dst拷贝数据。n在汇编指令中,普遍的方式:左边的操作数都是目的操作数,右边的操作数都是源操作数。MOVdst,src;dst=src2022/10/158MOV指令规则nMOV指令对操作数的使用是非常灵活的两个操作数的尺寸必须一致两个操作数不能同
4、时为内存操作数目的操作数不能是CS、EIP和IP立即数不能直接送至段寄存器不允许在两个段寄存器之间直接传送数据MOVreg,regMOVmem,regMOVreg,memMOVmem,immMOVreg,imm2022/10/159内存间的移动n单条MOV指令不能用于将数据从一个内存位置直接移动到另外一个内存位置n作为一种替代方法,在送至目的操作数之前,可以先将源操作数移入一个寄存器中.datavar1WORD?var2WORD?.codeMOVax,var1MOVvar2,ax2022/10/1510MOVZX/MOVSXn将源操作数的内容拷贝到目的操作数中MOVZX(movewithzer
5、o-extend)将该值零扩展至16位或32位MOVSX(movewithsign-extend)将该值符号扩展至16位或32位n目的操作数必须是寄存器例:MOVSXEAX,CLMOVSXEDX,EDIMOVZXDX,ALMOVZXEAX,DATA2022/10/1511XCHG指令n交换两个操作数的内容n操作数规则同MOV指令n若要交换两个内存操作数,需要使用寄存器作为临时存储,将MOV与XCHG指令结合使用xchgreg,regxchgreg,memxchgmem,regxchgax,bxxchgah,alxchgvar1,bxxchgeax,ebxmovax,var1xchgax,var
6、2movvar1,ax2022/10/1512直接内存操作数n变量名:数据段内偏移地址的引用n方括号注:可用符号地址代替数值地址.datavar1BYTE10h.codeMOVal,var1.datavar1BYTE10h,20h,30h.codeMOVal,var1+2;=moval,var1+22022/10/1513地址传送指令n地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES(LFS/LGS/LSS)n注意:不是获取存储器单元的内容2022/10/1515有效地址传送指令LEAn将存储器操作数的有效地址传送至指定的寄存器中。在实模式下,
7、使用16位寄存器在保护模式下,使用32位寄存器n该指令通常用来对指针或变址寄存器EBX、EDI或ESI等置初值之用。LEAReg,Mem2022/10/1516LEA与OFFSETnleaCPU指令标号/变量、表达式bufferdb100dup(0);把字节变量buffer的EA传送给EBXleaebx,buffermovebx,offsetbufferbufferdb100dup(0)leaebx,buffer+50 movebx,offsetbuffer+50;Xnoffset伪指令标号、变量一般来说,movreg,offsetxxx比leareg,xxx的指令长度少一个字节,且快一个时钟
8、,但lea更灵活2022/10/15172022/10/1518综合实例.386.modelflat,stdcall.dataval1WORD1000hval2WORD2000harrayBBYTE10h,20h,30h,40h,50harrayWWORD100h,200h,300harrayDDWORD10000h,20000h2022/10/1519.codestart:;内存与内存之间的数据交换movax,val1;AX=1000hxchgax,val2;AX=2000h,val2=1000hmovval1,ax;val1=2000h2022/10/1520;字节数组访问moval,ar
9、rayB;AL=10hmoval,arrayB+1;AL=20hmoval,arrayB+2;AL=30h;字数组访问movax,arrayW;AX=100hmovax,arrayW+2;AX=200h2022/10/1521;双字数组访问moveax,arrayD;EAX=10000hmoveax,arrayD+4;EAX=20000hmoveax,arrayD+TYPEarrayD;EAX=20000hleaebx,arrayD+4moveax,ebxENDstart2022/10/1522算术运算指令n算术运算是IA-32指令系统中另外一种基本的操作,可以用来执行字节,字或双字的二进制加
10、减乘除算术运算。n这类指令根据计算结果设置相应标志位。ADD、ADC、INCSUB、SBB、DECMUL、IMULDIV、IDIV2022/10/1523加法和减法n两种最基本的操作,指令:INC,DEC,ADD,SUB,NEG(求反)nINC、DECINCreg/memDECreg/memnADD/SUB格式:ADD/SUBdst,src操作数规则同MOV指令2022/10/1524加法指令n执行双字,字或字节的加法运算。n指令将目的操作数加上源操作数,结果送到目的操作数ADD:无符号算术运算ADC:带进位算术运算INC:加ADDreg,imm/reg/mem;regregimm/reg/m
11、emADDmem,imm/reg;memmemimm/reg2022/10/1525增量指令INC(increment)nINC指令对操作数加1(增量)nINC指令不影响进位CF标志,按定义设置其他状态标志INCreg/mem;reg/memreg/mem1incebxincbyteptrebx2022/10/1527减法指令nSUB指令将目的操作数减去源操作数,结果送到目的操作数nSUB指令按照定义相应设置状态标志SUBreg,imm/reg/mem;regregimm/reg/memSUBmem,imm/reg;memmemimm/reg2022/10/1528减量指令DEC(decrem
12、ent)nDEC指令对操作数减1(减量)nDEC指令不影响进位CF标志,按定义设置其他状态标志DECreg/mem;reg/memreg/mem1dececxdecwordptresiINC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整2022/10/1529求补指令NEG(negative)nNEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数n求补运算也可以表达成:将操作数按位取反后加1nNEG指令对标志的影响与用零作减法的SUB指令一样NEGreg/mem;reg/mem0reg/mem2022/10/1530比较指令CMP(compare)nCMP指令将
13、目的操作数减去源操作数,按照定义相应设置状态标志nCMP指令执行的功能与SUB指令相似,但结果不回送目的操作数CMPreg,imm/reg/mem;regimm/reg/memCMPmem,imm/reg;memimm/reg2022/10/1531算术运算影响的标志n零标志和符号标志目标操作数被赋以零值时,零标志ZF置算术运算结果为负时,符号标志SF置n进位标志(无符号算术运算)无符号算术运算结果对目的操作数而言无法容纳时,进位标专CF置n溢出标志(有符号算术运算)当算术运算产生的有符号的结果无法容纳于目的操作数时,溢出标志OF置2022/10/1532进位与溢出标志n加法:和的最高有效位有
14、向高位的进位,CF=1;其他,CF=0;两个操作数符号相同,而结果符号与之相反,OF=1;其他,OF=0;n减法:被减数的最高有效位有向高位的借位,CF=1;其他,CF=0;两个操作数符号相反,而结果的符号与减数相同,OF=1;其他,OF=0;2022/10/1533例:双精度数的加法(DX)=0002H(AX)=0F365H(BX)=0005H(CX)=8100H指令序列ADDAX,CX;(1)ADCDX,BX;(2)(1)执行后,(AX)=7465HCF=1OF=1SF=0ZF=0(2)执行后,(DX)=0008HCF=0OF=0SF=0ZF=02022/10/1534例:双精度数的减法(
15、DX)=1234H(AX)=4AE0H(BX)=9090H指令序列SUBDX,AX;(1)SBBBX,AX;(2)(1)执行后,(DX)=C754HSF=1ZF=0CF=1OF=0(2)执行后,(BX)=45AFHSF=0ZF=0CF=0OF=12022/10/1535例:x、y、z均为双精度数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,并用W,W+2单元存放w16位寄存器:MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-z
16、MOVW,AXMOVW+2,DX;结果存入W,W+2单元2022/10/153632位寄存器:MOVEAX,XADDEAX,Y;x+yADDEAX,24;x+y+24SUBEAX,Z;x+y+24-zMOVW,EAX;结果存入W,W+2单元2022/10/1537乘法指令n计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。无符号数乘法指令MUL有符号数乘法指令IMULn指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。2022/10/1538MUL/IMULn指令的格式:MUL/IMUL
17、Reg/Memn影响的标志位:CF和OFMUL指令若乘积的高半部分(AH或DX或EDX)为0,则OF=CF=0;否则OF=CF=1IMUL指令若乘积的高半部分是低半部分的符号扩展,则OF=CF=0;否则均为1乘数位数隐含的被乘数乘积的存放位置举例8位ALAXMULBL16位AXDX-AXMULBX32位EAXEDX-EAXMULECX2022/10/1539例:(AX)=16A5H,(BX)=0611H(1)IMULBL;(AX)(AL)*(BL);A5*115B*11=060BF9F5;(AX)=0F9F5HCF=OF=1(2)MULBX;(DX,AX)(AX)*(BX);16A5*0611
18、=00895EF5;(DX)=0089H(AX)=5EF5HCF=OF=100乘积的高一半是低一半的符号扩展11否则IMUL指令:CF,OF=00乘积的高一半为零11否则MUL指令:CF,OF=00乘积的高一半是低一半的符号扩展11否则00乘积的高一半为零11否则00乘积的高一半为零11否则00乘积的高一半是低一半的符号扩展11否则00乘积的高一半为零11否则2022/10/1540例:16位无符号数乘法.386.MODELFLAT.dataxword0FFFEhyword001Ehresultdword?.codestart:movax,x;axx,muly;乘法:ax*ymovwordpt
19、rresult,ax;存放乘积的低字部分movwordptrresult+2,dx;存放乘积的高字部分retendstart2022/10/1541用32位有符号乘法指令实现16位有符号数的乘法.dataxword100yword200resultdword?.codemovsxeax,x;eaxxmovsxebx,y;ebxyimulebx;乘法:eax*ebxmovresult,eax;存放乘积2022/10/1542IMUL的其他格式(二或三操作数)nIMULr16,r16/m16/i8/i16;有符号字乘:r16r16r16/m16/i8/i16nIMULr32,r32/m32/i8/
20、i16/i32;有符号双字乘:r32r32r32/m32/i32/i16/i8nIMULr16,r16/m16,i8/i16;有符号字乘:r16r16/m16/i8/i16nIMULr32,r32/m32,i8/i32;有符号双字乘:r32r32/m32/i8/i32imuleax,ebx;eax=ebx*eaximuleax,ebx,2;eax=ebx*22022/10/1543除法指令n除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。n除法指令功能是用隐含操作数除以显式操作数,得到商和
21、余数。2022/10/1544DIV/IDIVn指令格式:DIV/IDIVReg/Imm(对标志位无定义)nIDIV时,须将被除数符号扩展到高半部CBW:将AL中的符号位扩展到AH寄存器中CWD:将AX中的符号位扩展到DX寄存器中CDQ:将EAX中的符号位扩展到EDX寄存器中除数位数隐含的被除数隐含的被除数商余数举例8位AXAXALAHDIVBH16位DX-AXDX-AXAXDXDIVBX32位EDX-EAXEDX-EAXEAXEDXDIVECX注:除法指令不考虑标志位定义。2022/10/1545例:(AX)=0400H,(BL)=0B4H(AX)为无符号数1024D,带符号数+1024D(
22、BL)为无符号数180D,带符号数-76D(4CH)(1)DIVBL(AH)=7CH=124D;余数(AL)=05H=5D;商(2)IDIVBL(AH)=24H=36D;余数(AL)=0F3H=-13D;商如:(AX)=-1024D,(BL)=76D;(AX)=-1024D,(BL)=-76D;(AH)=?(AL)=?注:乘法和除法带符号数去补运算(两次:初始乘法和除法带符号数去补运算(两次:初始/结束)结束)2022/10/1546moval,-48cbw;扩展AL的符号到AHmovbl,5idivbl;AL=AH=movax,-5000cwd;扩展AX的符号到DXmovbx,256idiv
23、bx;AX=DX=moveax,-50000cdq;扩展EAX的符号到EDXmovebx,256idivebx;EAX=EDX=2022/10/1547除法溢出n当除数为0,或商太大超出目的操作数所能表示的范围时,导致除法溢出,CPU自动触发一个中断。对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,或者在双字除时商超过32位,则发生除法溢出。对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,或者在双字除时商不在-2322321范围内,则发生除法溢出。2022/10/1548除法溢出movax,2000
24、0movbl,10divbl;20000102000;商在AL中放不下,产生溢出movdx,0movax,20000movbx,10divbx;20000102000;商在AX中可以放下,不产生溢出解决:增大除数的位数2022/10/1549除法溢出movax,20000movbl,0divbl;200000movax,20000movbl,xcmpbl,0jeZerodivblZero:解决:测试除数是否为02022/10/1550乘法溢出?nMUL/IMUL是否会产生溢出?乘数位数隐含的被乘数隐含的被乘数乘积的存放位置举例8位ALALAXMULBL16位AXAXDX-AXMULBX32位E
25、AXEAXEDX-EAXMULECX不会,因为存放乘积的寄存器的大小是乘数和被乘数的2倍2022/10/1551例:x,y,z,v均为16位带符号数,计算(v-(x*y+z540)/xMOVAX,XIMULY;x*y(DX,AX)MOVCX,AXMOVBX,DXMOVAX,ZCWD;Z(DX,AX)ADDCX,AXADCBX,DX;x*y+z(BX,CX)SUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWD;V(DX,AX)SUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540)/x(AX)余数(DX)2022/10/1552例:
26、算术表达式n32位无符号整数var4=(var1+var2)*var3var4=var1*5/(var23)n32位有符号整数var4=var1*-5/(-var2%var3)2022/10/1553var4=(var1+var2)*var3var1dd100var2dd25var3dd8var4dd?moveax,var1addeax,var2;var1+var2mulvar3;(var1+var2)*var3jctooBig;高一半是否为零;CF=1则转移movvar4,eaxjmpNexttooBig:Next:2022/10/1554var4=var1*5/(var23)var1dd1
27、00var2dd25var3dd8var4dd?moveax,var1movebx,5mulebxmovebx,var2subebx,3divebxmovvar4,eax2022/10/1555var4=var1*-5/(-var2%var3)var1dd100var2dd25var3dd8var4dd?moveax,var2negeaxcdqidivvar3movebx,edxmoveax,-5imulvar1idivebxmovvar4,eax2022/10/1556小结:MUL/IMUL-DIV/IDIV除数位数隐含的被除数商余数举例8位AXALAHDIVBH16位DX-AXAXDXDI
28、VBX32位EDX-EAXEAXEDXDIVECX乘数位数隐含的被乘数乘积的存放位置举例8位ALAXMULBL16位AXDX-AXMULBX32位EAXEDX-EAXMULECX2022/10/1557练习:n求出以下各十六进制数与十六进制数62A0H之和,并根据结果设置标志位SF、ZF、CF和OF的值。(1)1234H(2)4321H(3)CFA0H(4)9D60Hn求出以下各十六进制数与十六进制数4AE0H的差值,并根据结果设置标志位SF、ZF、CF和OF的值。(1)1234H(2)5D90H(3)9090H(4)EA04H2022/10/1558答案:1.答:(1)和为74D4H;SF=
29、0,ZF=0,CF=0,OF=0(2)和为A5C1H;SF=1,ZF=0,CF=0,OF=1(3)和为3240H;SF=0,ZF=0,CF=1,OF=0(4)和为0000H;SF=0,ZF=1,CF=1,OF=02.答:(1)差为C754H;SF=1,ZF=0,CF=1,OF=0(2)差为12B0H;SF=0,ZF=0,CF=0,OF=0(3)差为45B0H;SF=0,ZF=0,CF=0,OF=1(4)差为9F24H;SF=1,ZF=0,CF=0,OF=02022/10/1559课后练习:n写出执行以下计算的指令序列,其中X、Y、Z、R、W均为存放16位带符号数单元的地址。(1)ZW+(Z-X)(2)ZW-(X+6)-(R+9)(3)Z(W*X)/(Y+6),R余数(4)Z(W-X)/5*Y)*22022/10/1560