您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > Win32汇编语言-指令系统
2020/3/271IA-32指令系统宋军计算机学院信息安全系songjun@cug.edu.cn22020/3/27主要内容IA-32通用指令集数据传送类指令算术运算类指令位操作类指令串操作类指令控制转移类指令处理机控制类指令其他类32020/3/27IA-32指令系统计算机的指令系统是指计算机能够执行的全部指令的集合。IA-32CPU指令系统包括:①通用指令②浮点运算指令③SIMD指令④MMX指令(多媒体扩展指令集)⑤SSE/SSE2/SSE3指令(单指令多数据流扩展)⑥系统指令⑦64位模式的指令42020/3/27通用指令集合①数据传送类指令②算术运算类指令③位操作类指令④串操作类指令⑤控制转移类指令⑥处理机控制类指令⑦其他类52020/3/27汇编指令格式target:movcount,ebx;EBX送变量到count标号:指令在主存中的逻辑地址指令助记符:指令的名称操作数:表示参与指令操作的对象个数可以是0/1/2/3,多个操作数之间以逗号(,)隔开。存放操作结果的操作数叫做目的操作数,一般是指令中的第一个操作数参与操作的其他操作数叫做源操作注释:增加可读性。标号:指令助记符操作数列表;注释62020/3/27操作数操作数类型imm立即操作数reg寄存器操作数mem内存操作数操作数的寻址方式立即数寻址寄存器寻址存储器寻址72020/3/27数据传送指令数据传送是计算机中最基本、最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGPUSHPOPLEA82020/3/27MOV指令MOV指令是一个数据传送指令,其格式为:MOV指令的功能是从源操作数src向目的操作数dst拷贝数据。在汇编指令中.普遍的方式:左边的操作数都是目的操作数,右边的操作数都是源操作数。MOVdst,src;dst=src92020/3/27MOV指令规则MOV指令对操作数的使用是非常灵活的两个操作数的尺寸必须一致两个操作数不能同时为内存操作数目的操作数不能是CS、EIP和IP立即数不能直接送至段寄存器不允许在两个段寄存器之间直接传送数据MOVreg,regMOVmem,regMOVreg,memMOVmem,immMOVreg,imm102020/3/27内存间的移动单条MOV指令不能用于将数据从一个内存位置直接移动到另外一个内存位置作为一种替代方法,在送至目的操作数之前,可以先将源操作数移入一个寄存器中.datavar1WORD?var2WORD?.codeMOVax,var1MOVvar2,ax112020/3/27MOVZX/MOVSX将源操作数的内容拷贝到目的操作数中MOVZX(movewithzero-extend)将该值零扩展至16位或32位MOVSX(movewithsigh-extend)将该值符号扩展至16位或32位目的操作数必须是寄存器例:MOVSXEAX,CLMOVSXEDX,[EDI]MOVZXDX,ALMOVZXEAX,DATA122020/3/27XCHG指令交换两个操作数的内容操作数规则同MOV指令若要交换两个内存操作数,需要使用寄存器作为临时存储,将MOV与XCHG指令结合使用xchgreg,regxchgreg,memxchgmem,regxchgax,bxxchgah,alxchgvar1,bxxchgeax,ebxmovax,var1xchgax,var2movvar1,ax132020/3/27直接内存操作数变量名:数据段内偏移地址的引用方括号[].datavar1BYTE10h.codeMOVal,var1.datavar1BYTE10h,20h,30h.codeMOVal,[var1+2];moval,var1+2152020/3/27地址传送指令地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES(LFS/LGS/LSS)注意:不是获取存储器单元的内容162020/3/27有效地址传送指令LEA将存储器操作数的有效地址传送至指定的寄存器中。在实模式下,使用16位寄存器在保护模式下使用32位寄存器该指令通常用来对指针或变址寄存器EBX、EDI或ESI等置初值之用。LEAReg,Mem172020/3/27LEA与OFFSETleaCPU指令标号/变量、表达式bufferdb100dup(0);把字节变量buffer的EA传送给EBXleaebx,buffermovebx,offsetbufferbufferdb100dup(0)leaebx,[buffer+50]movebx,offset[buffer+50];Xoffset伪指令标号、变量一般来说,movreg,offsetxxx比leareg,xxx的指令长度少一个字节,且快一个时钟,但lea更灵活。182020/3/27192020/3/27综合实例.386.modelflat,stdcall.dataval1WORD1000hval2WORD2000harrayBBYTE10h,20h,30h,40h,50harrayWWORD100h,200h,300harrayDDWORD10000h,20000h202020/3/27.codestart:;内存与内存之间的数据交换movax,val1;AX=1000hxchgax,val2;AX=2000h,val2=1000hmovval1,ax;val1=2000h212020/3/27;字节数组访问moval,arrayB;AL=10hmoval,[arrayB+1];AL=20hmoval,[arrayB+2];AL=30h;字数组访问movax,arrayW;AX=100hmovax,[arrayW+2];AX=200h222020/3/27;双字数组访问moveax,arrayD;EAX=10000hmoveax,[arrayD+4];EAX=20000hmoveax,[arrayD+TYPEarrayD];EAX=20000hleaebx,[arrayD+4]moveax,[ebx]ENDstart232020/3/27算术运算指令算术运算是IA-32指令系统中另外一种基本的操作,可以用来执行字节,字或双字的二进制加减乘除算术运算。这类指令根据计算结果设置相应标志位。ADD、ADC、INCSUB、SBB、DECMUL、IMULDIV、IDIV242020/3/27242020/3/27加法和减法两种最基本的操作,指令:INC,DEC,ADD,SUB,NEG(求反)INC、DECINCreg/memDECreg/memADD/SUB格式:ADD/SUBdest,src操作数规则同MOV指令.dataW1WORD1000hW2WORD2000h.codeincW1;1001hmovbx,W1decbx;1000hmoveax,w2addeax,bxsubeax,W1252020/3/27加法指令执行双字,字或字节的加法运算。指令将目的操作数加上源操作数,结果送到目的操作数ADD:无符号算术运算ADC:带进位算术运算INC:加1ADDreg,imm/reg/mem;reg←reg+imm/reg/memADDmem,imm/reg;mem←mem+imm/reg272020/3/27增量指令INC(increment)INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志INCreg/mem;reg/mem←reg/mem+1incebxincbyteptr[ebx]282020/3/27减法指令SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志SUBreg,imm/reg/mem;reg←reg-imm/reg/memSUBmem,imm/reg;mem←mem-imm/reg292020/3/27减量指令DEC(decrement)DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志DECreg/mem;reg/mem←reg/mem-1dececxdecwordptr[esi]INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整302020/3/27求补指令NEG(negative)NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样NEGreg/mem;reg/mem←0-reg/mem312020/3/27比较指令CMP(compare)CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志CMP指令执行的功能与SUB指令相似,但结果不回送目的操作数CMPreg,imm/reg/mem;reg-imm/reg/memCMPmem,imm/reg;mem-imm/reg322020/3/27算术运算影响的标志零标志和符号标志目标操作数被赋以零值时,零标志ZF置1算术运算结果为负时,符号标志SF置1进位标志(无符号算术运算)无符号算术运算结果对目的操作数而言无法容纳时,进位标专CF置1溢出标志(有符号算术运算)当算术运算产生的有符号的结果无法容纳于目的操作数时,溢出标志OF置1332020/3/27进位与溢出标志加法:和的最高有效位有向高位的进位,CF=1;其他,CF=0;两个操作数符号相同,而结果符号与之相反,OF=1;其他,OF=0;减法:被减数的最高有效位有向高位的借位,CF=1;其他,CF=0;两个操作数符号相反,而结果的符号与减数相同,OF=1;其他,OF=0;342020/3/27例:双精度数的加法(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=0352020/3/27例:双精度数的减法(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=1362020/3/27例: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-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元372020/3/2732位寄存器:MOVEAX,XADDEAX,Y;x+yADDEAX,24;x+y+24SUBEAX,Z;x+y+24-zMOVW,EAX;结果存入W,W+2单元382020/3/27乘法指令计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。无符号数乘法指令MUL有符号数乘法指令IMUL指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。392020/3/27MUL/IMUL指令的格式:MUL/IMULReg/Mem影响的标志位:CF和OFMUL指令——若乘积的高半部分(AH或DX或EDX)为0,则OF
本文标题:Win32汇编语言-指令系统
链接地址:https://www.777doc.com/doc-4582310 .html