第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt_第1页
第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt_第2页
第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt_第3页
第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt_第4页
第三章 Win32汇编语言-汇编语言程序设计基础-指令系统.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

2020 1 27 1 Windows32位汇编语言程序设计体系结构 第三节IA 32指令系统 宋军计算机学院信息安全系songjun 2 2020 1 27 主要内容 IA 32通用指令集数据传送类指令算术运算类指令位操作类指令串操作类指令控制转移类指令处理机控制类指令其他类 3 2020 1 27 IA 32指令系统 计算机的指令系统是指计算机能够执行的全部指令的集合 IA 32CPU指令系统包括 通用指令 浮点运算指令 SIMD指令 MMX指令 多媒体扩展指令集 SSE SSE2 SSE3指令 单指令多数据流扩展 系统指令 64位模式的指令 4 2020 1 27 通用指令集合 数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理机控制类指令 其他类 5 2020 1 27 汇编指令格式 target movcount ebx EBX送变量到count标号 指令在主存中的逻辑地址指令助记符 指令的名称操作数 表示参与指令操作的对象个数可以是0 1 2 3 多个操作数之间以逗号 隔开 存放操作结果的操作数叫做目的操作数 一般是指令中的第一个操作数参与操作的其他操作数叫做源操作数注释 增加可读性 标号 指令助记符操作数列表 注释 6 2020 1 27 操作数 操作数类型imm立即操作数reg寄存器操作数mem内存操作数 操作数的寻址方式立即数寻址寄存器寻址存储器寻址 7 2020 1 27 数据传送指令 数据传送是计算机中最基本 最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外 均不影响标志位重点掌握MOVXCHGPUSHPOPLEA 8 2020 1 27 MOV指令 MOV指令是一个数据传送指令 其格式为 MOV指令的功能是从源操作数src向目的操作数dst拷贝数据 在汇编指令中 普遍的方式 左边的操作数都是目的操作数 右边的操作数都是源操作数 MOVdst src dst src 9 2020 1 27 MOV指令规则 MOV指令对操作数的使用是非常灵活的两个操作数的尺寸必须一致两个操作数不能同时为内存操作数目的操作数不能是CS EIP和IP立即数不能直接送至段寄存器不允许在两个段寄存器之间直接传送数据 MOVreg regMOVmem regMOVreg memMOVmem immMOVreg imm 10 2020 1 27 内存间的移动 单条MOV指令不能用于将数据从一个内存位置直接移动到另外一个内存位置作为一种替代方法 在送至目的操作数之前 可以先将源操作数移入一个寄存器中 datavar1WORD var2WORD codeMOVax var1MOVvar2 ax 11 2020 1 27 MOVZX MOVSX 将源操作数的内容拷贝到目的操作数中MOVZX movewithzero extend 将该值零扩展至16位或32位MOVSX movewithsign extend 将该值符号扩展至16位或32位目的操作数必须是寄存器 例 MOVSXEAX CLMOVSXEDX EDI MOVZXDX ALMOVZXEAX DATA 12 2020 1 27 XCHG指令 交换两个操作数的内容操作数规则同MOV指令若要交换两个内存操作数 需要使用寄存器作为临时存储 将MOV与XCHG指令结合使用 xchgreg regxchgreg memxchgmem reg xchgax bxxchgah alxchgvar1 bxxchgeax ebx movax var1xchgax var2movvar1 ax 13 2020 1 27 直接内存操作数 变量名 数据段内偏移地址的引用方括号 注 可用符号地址代替数值地址 datavar1BYTE10h codeMOVal var1 datavar1BYTE10h 20h 30h codeMOVal var1 2 moval var1 2 14 2020 1 27 要小心段寄存器的操作 不允许立即数传送给段寄存器MOVDS 100H 非法指令 立即数不能传送段寄存器不允许直接改变CS值MOVCS SI 不允许使用的指令不允许段寄存器之间的直接数据传送MOVDS ES 非法指令 不允许段寄存器间传送 15 2020 1 27 地址传送指令 地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES LFS LGS LSS 注意 不是获取存储器单元的内容 16 2020 1 27 有效地址传送指令LEA 将存储器操作数的有效地址传送至指定的寄存器中 在实模式下 使用16位寄存器在保护模式下 使用32位寄存器该指令通常用来对指针或变址寄存器EBX EDI或ESI等置初值之用 LEAReg Mem 17 2020 1 27 LEA与OFFSET leaCPU指令标号 变量 表达式 bufferdb100dup 0 把字节变量buffer的EA传送给EBXleaebx buffer movebx offsetbuffer bufferdb100dup 0 leaebx buffer 50 movebx offset buffer 50 X offset伪指令标号 变量 一般来说 movreg offsetxxx比leareg xxx的指令长度少一个字节 且快一个时钟 但lea更灵活 18 2020 1 27 19 2020 1 27 综合实例 386 modelflat stdcall dataval1WORD1000hval2WORD2000harrayBBYTE10h 20h 30h 40h 50harrayWWORD100h 200h 300harrayDDWORD10000h 20000h 20 2020 1 27 codestart 内存与内存之间的数据交换movax val1 AX 1000hxchgax val2 AX 2000h val2 1000hmovval1 ax val1 2000h 21 2020 1 27 字节数组访问moval arrayB AL 10hmoval arrayB 1 AL 20hmoval arrayB 2 AL 30h 字数组访问movax arrayW AX 100hmovax arrayW 2 AX 200h 22 2020 1 27 双字数组访问moveax arrayD EAX 10000hmoveax arrayD 4 EAX 20000hmoveax arrayD TYPEarrayD EAX 20000hleaebx arrayD 4 moveax ebx ENDstart 23 2020 1 27 算术运算指令 算术运算是IA 32指令系统中另外一种基本的操作 可以用来执行字节 字或双字的二进制加减乘除算术运算 这类指令根据计算结果设置相应标志位 ADD ADC INCSUB SBB DECMUL IMULDIV IDIV 24 2020 1 27 加法和减法 两种最基本的操作 指令 INC DEC ADD SUB NEG 求反 INC DECINCreg memDECreg memADD SUB格式 ADD SUBdst src操作数规则同MOV指令 25 2020 1 27 加法指令 执行双字 字或字节的加法运算 指令将目的操作数加上源操作数 结果送到目的操作数ADD 无符号算术运算ADC 带进位算术运算INC 加 ADDreg imm reg mem reg reg imm reg memADDmem imm reg mem mem imm reg 26 2020 1 27 datavar1dword10000hvar2dword2000h codestart moval 0fbh al 0fbhaddal 07h al 02hmoveax var1 eax 10000haddeax var2 eax 12000hret 加法指令 27 2020 1 27 增量指令INC increment INC指令对操作数加1 增量 INC指令不影响进位CF标志 按定义设置其他状态标志 INCreg mem reg mem reg mem 1 incebxincbyteptr ebx 28 2020 1 27 减法指令 SUB指令将目的操作数减去源操作数 结果送到目的操作数SUB指令按照定义相应设置状态标志 SUBreg imm reg mem reg reg imm reg memSUBmem imm reg mem mem imm reg 29 2020 1 27 减量指令DEC decrement DEC指令对操作数减1 减量 DEC指令不影响进位CF标志 按定义设置其他状态标志 DECreg mem reg mem reg mem 1 dececxdecwordptr esi INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整 30 2020 1 27 求补指令NEG negative NEG指令对操作数执行求补运算 用零减去操作数 然后结果返回操作数求补运算也可以表达成 将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样 NEGreg mem reg mem 0 reg mem 31 2020 1 27 比较指令CMP compare CMP指令将目的操作数减去源操作数 按照定义相应设置状态标志CMP指令执行的功能与SUB指令相似 但结果不回送目的操作数 CMPreg imm reg mem reg imm reg memCMPmem imm reg mem imm reg 32 2020 1 27 算术运算影响的标志 零标志和符号标志目标操作数被赋以零值时 零标志ZF置 算术运算结果为负时 符号标志SF置 进位标志 无符号算术运算 无符号算术运算结果对目的操作数而言无法容纳时 进位标专CF置 溢出标志 有符号算术运算 当算术运算产生的有符号的结果无法容纳于目的操作数时 溢出标志OF置 33 2020 1 27 进位与溢出标志 加法 和的最高有效位有向高位的进位 CF 1 其他 CF 0 两个操作数符号相同 而结果符号与之相反 OF 1 其他 OF 0 减法 被减数的最高有效位有向高位的借位 CF 1 其他 CF 0 两个操作数符号相反 而结果的符号与减数相同 OF 1 其他 OF 0 34 2020 1 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 0 35 2020 1 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 1 36 2020 1 27 例 x y z均为双精度数 分别存放在地址为X X 2 Y Y 2 Z Z 2的存储单元中 用指令序列实现w x y 24 z 并用W W 2单元存放w 16位寄存器 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单元 37 2020 1 27 32位寄存器 MOVEAX XADDEAX Y x yADDEAX 24 x y 24SUBEAX Z x y 24 zMOVW EAX 结果存入W W 2单元 38 2020 1 27 乘法指令 计算机的乘法指令分为无符号乘法指令和有符号乘法指令 它们的唯一区别就在于 数据的最高位是作为 数值 参与运算 还是作为 符号位 参与运算 无符号数乘法指令MUL有符号数乘法指令IMUL指令的功能是把显式操作数和隐含操作数相乘 并把乘积存入相应的寄存器中 39 2020 1 27 MUL IMUL 指令的格式 MUL IMULReg Mem影响的标志位 CF和OFMUL指令 若乘积的高半部分 AH或DX或EDX 为0 则OF CF 0 否则OF CF 1IMUL指令 若乘积的高半部分是低半部分的符号扩展 则OF CF 0 否则均为1 40 2020 1 27 例 AX 16A5H BX 0611H 1 IMULBL AX AL BL A5 11 5B 11 060B F9F5 AX 0F9F5HCF OF 1 2 MULBX DX AX AX BX 16A5 0611 00895EF5 DX 0089H AX 5EF5HCF OF 1 00乘积的高一半是低一半的符号扩展11否则 IMUL指令 CF OF 00乘积的高一半为零11否则 MUL指令 CF OF 00乘积的高一半是低一半的符号扩展11否则 00乘积的高一半为零11否则 00乘积的高一半为零11否则 00乘积的高一半是低一半的符号扩展11否则 00乘积的高一半为零11否则 41 2020 1 27 例 16位无符号数乘法 386 MODELFLAT dataxword0FFFEhyword001Ehresultdword codestart movax x ax x muly 乘法 ax ymovwordptrresult ax 存放乘积的低字部分movwordptrresult 2 dx 存放乘积的高字部分retendstart 42 2020 1 27 用32位有符号乘法指令实现16位有符号数的乘法 dataxword 100yword 200resultdword codemovsxeax x eax xmovsxebx y ebx yimulebx 乘法 eax ebxmovresult eax 存放乘积 43 2020 1 27 IMUL的其他格式 二或三操作数 IMULr16 r16 m16 i8 i16 有符号字乘 r16 r16 r16 m16 i8 i16IMULr32 r32 m32 i8 i16 i32 有符号双字乘 r32 r32 r32 m32 i32 i16 i8IMULr16 r16 m16 i8 i16 有符号字乘 r16 r16 m16 i8 i16IMULr32 r32 m32 i8 i32 有符号双字乘 r32 r32 m32 i8 i32 imuleax ebx eax ebx eaximuleax ebx 2 eax ebx 2 44 2020 1 27 除法指令 除法指令的被除数是隐含操作数 除数在指令中显式地写出来 CPU会根据除数是8位 16位 还是32位 来自动选用被除数AX DX AX 还是EDX EAX 除法指令功能是用隐含操作数除以显式操作数 得到商和余数 45 2020 1 27 DIV IDIV 指令格式 DIV IDIVReg Imm 对标志位无定义 IDIV时 须将被除数符号扩展到高半部CBW 将AL中的符号位扩展到AH寄存器中CWD 将AX中的符号位扩展到DX寄存器中CDQ 将EAX中的符号位扩展到EDX寄存器中 注 除法指令不考虑标志位定义 46 2020 1 27 例 AX 0400H BL 0B4H AX 为无符号数1024D 带符号数 1024D 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 注 乘法和除法带符号数去补运算 两次 初始 结束 47 2020 1 27 moval 48cbw 扩展AL的符号到AHmovbl 5idivbl AL AH movax 5000cwd 扩展AX的符号到DXmovbx 256idivbx AX DX moveax 50000cdq 扩展EAX的符号到EDXmovebx 256idivebx EAX EDX 48 2020 1 27 除法溢出 当除数为0 或商太大超出目的操作数所能表示的范围时 导致除法溢出 CPU自动触发一个中断 对DIV指令 除数为0 或者在字节除时商超过8位 或者在字除时商超过16位 或者在双字除时商超过32位 则发生除法溢出 对IDIV指令 除数为0 或者在字节除时商不在 128 127范围内 或者在字除时商不在 32768 32767范围内 或者在双字除时商不在 232 232 1范围内 则发生除法溢出 49 2020 1 27 除法溢出 movax 20000movbl 10divbl 20000 10 2000 商在AL中放不下 产生溢出 movdx 0movax 20000movbx 10divbx 20000 10 2000 商在AX中可以放下 不产生溢出 解决 增大除数的位数 50 2020 1 27 除法溢出 movax 20000movbl 0divbl 20000 0 movax 20000movbl xcmpbl 0jeZerodivblZero 解决 测试除数是否为0 51 2020 1 27 乘法溢出 MUL IMUL是否会产生溢出 不会 因为存放乘积的寄存器的大小是乘数和被乘数的2倍 52 2020 1 27 例 x y z v均为16位带符号数 计算 v x y z 540 x MOVAX 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 53 2020 1 27 例 算术表达式 32位无符号整数var4 var1 var2 var3var4 var1 5 var2 3 32位有符号整数var4 var1 5 var2 var3 54 2020 1 27 var4 var1 var2 var3 var1dd100var2dd25var3dd8var4dd moveax var1addeax var2 var1 var2mulvar3 var1 var2 var3jctooBig 高一半是否为零 CF 1则转移movvar4 eaxjm

温馨提示

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

评论

0/150

提交评论