已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计,_06_整数运算指令与高级过程 大连理工大学软件学院_朱明 2009年5月31日_ V1.1,提问与回顾,第五章内容中我们介绍并练习了外部链接库中的一些常用过程 调用这些过程使用什么指令? 在逻辑运算部分内容中 AND指令用于进行逻辑与运算,但他在改变标志位的同时也改变了目的操作数,什么指令能够实现逻辑与运算功能但只改变标志位而不改变操作数? 同样,哪条指令与SUB类似但只改变标志位? 该条指令比较后,如相等则跳转,应使用什么指令? 尝试将下面的为指令转化成为汇编代码和决策伪指令,汇编语言程序设计 - 朱明,2,if (bx cx) X=1;,提问与回顾,SHL(Shift Left),逻辑左移操作 最低位以0填充,最高位传送到CF中 SHR(Shift Right),逻辑右移操作 最高位以0填充,最低位传送到CF中 左移和右移的意义:乘法和除法,逻辑移位,汇编语言程序设计 - 朱明,3,SHL/SHR reg, imm8 mem, imm8 reg, CL mem, CL,mov al, 0D0h,AL = 1101 0000b,shr al, 1,AL = 0110 1000b,CF = 1,Section 1,逻辑移位,课堂练习题目位串分离 如果需要从一个字或者字节中的特定区域提取一系列位,这些位称为位串 例如文件的时间戳(文件最后访问时间)的分离,汇编语言程序设计 - 朱明,4,Section 1,DH,DL,year,month,day,mov al, dl and al, 01Fh mov day, al,mov ax, dx shr ax, 5 and al, 0Fh mov month, al,mov al, dh shr al, 1 and ah, 0h add ax, 1980 mov year, ax,SAL(Shift Arithmetic Left),算术左移操作 最低位以0填充,最高位传送到CF中,同SHL SAR(Shift Arithmetic Right),算术右移操作 最高位以自身填充,最低位传送到CF中 右移的算术意义:有符号数除法,算术移位,汇编语言程序设计 - 朱明,5,SAL/SAR reg, imm8 mem, imm8 reg, CL mem, CL,mov al, -128,AL = 1000 0000b,sar al, 4,AL = 1111 1000b,Section 1,ROL(Rotate Left),循环左移操作 最低位以最高位填充,最高位传送到CF中 ROR(Rotate Right),循环右移操作 最高位以最低位填充,最低位传送到CF中 循环移位不丢弃数据 可用来将特定的位移入CF中,循环移位,汇编语言程序设计 - 朱明,6,ROL/ROR reg, imm8 mem, imm8 reg, CL mem, CL,Section 1,SHLD(Shift Left Double),双精度左移操作 目的操作数向左移指定位数 空位用源操作数的高位填充 源操作数不会有任何改变 SHRD(Shift Right Double) 目的操作数向右移指定位数 空位用源操作数的低位填充 源操作数不会有任何改变,双精度移位,汇编语言程序设计 - 朱明,7,SHLD/SHLR reg16, reg16, CL/imm8 mem16,reg16, CL/imm8 reg32, reg32, CL/imm8 mem32,reg32, CL/imm8,Section 1,bx,ax,mov bx, 9BA6h mov ax, 0AC36h shld bx, ax, 4,乘法指令,MUL无符号数乘法指令 8位、16位或32位被乘数依次为AL、AX或EAX 对应的乘数可以是尺寸相等的寄存器或内存 对应结果保存在AX、DX:AX、EDX:EAX中 CF标值位的影响 高半部分如果不为0则CF位置位,汇编语言程序设计 - 朱明,8,MUL reg/mem8 reg/mem16 reg/mem32,Section 2,mov eax, 12345h mov ebx, 10000h mul ebx,EDX:EAX = 0000 0001 2345 0000h CF = 1,乘法指令,IMUL有符号数乘法指令 IMUL有单操作数、双操作数和三操作数三种格式 单操作数的情况与MUL相同 此时如果高半部分是结果的符号位扩展则OF=0,汇编语言程序设计 - 朱明,9,mov al, 48 mov bl, 4 imul bl,AX = 00C0h OF = 1,IMUL reg/mem8 reg/mem16 reg/mem32,mov al, -4 mov bl, 4 imul bl,AX = FFF0h OF = 0,mov ax, 48 mov bx, 4 imul bx,DX = 0000h AX = 00C0h OF = 0,Section 2,乘法指令,IMUL有符号数乘法指令 IMUL有单操作数、双操作数和三操作数三种格式 双操作数的乘积存储在第一个操作数中,但只能是寄存器,第二个操作数可以是寄存器、内存操作数或者立即数 三操作数的乘积存储在第一个操作数中,但只能是寄存器,第二操作数可以是寄存器或内存,第三操作数是立即数 要特别注意运算结果的尺寸问题:超出则CF和OF置位,汇编语言程序设计 - 朱明,10,Section 2,IMUL,双操作数 reg16, reg/mem16 reg16, imm8/16 reg32, reg/mem32 reg32, imm8/32,IMUL,三操作数 reg16,reg/mem16,imm8 reg16,reg/mem16,imm16 reg32,reg/mem32,imm8 reg32,reg/mem32,imm32,乘法指令,关于MUL和IMUL乘法的问题 传统意义上对于乘法运算是能少用就尽量少用 乘法的执行效率要低于移位操作的速度 理论上后一种方法的执行效率要远高于前一种方法 但是对于某些处理器则可能有所不同 老式的体系结构上,如Pentium4,比较会很明显 在嵌入式系统上,比较同样会很明显 在Core以上的体系结构上,比较结果不明显,汇编语言程序设计 - 朱明,11,Section 2,mov ebx, eax shl eax, 5 shl ebx, 2 add eax, ebx,mov ebx, 36 mul ebx,除法指令,DIV无符号数除法指令,汇编语言程序设计 - 朱明,12,DIV reg/mem8 reg/mem16 reg/mem32,Section 3,mov ax, 83h mov bl, 2 div bl,AL = 41h AH = 1,mov dx, 0 mov ax, 8003 mov cx, 100 div cx,AX = 80 DX = 3,除法指令,IDIV有符号数除法指令 在进行除法指令前,应首先进行符号位扩展 符号位扩展用于将AL、AX和EAX的符号分别扩展至AH、DX和EDX中,以保证运算结果的符号正确,汇编语言程序设计 - 朱明,13,IDIV reg/mem8 reg/mem16 reg/mem32,Section 3,mov al, -48 cbw mov bl, 5 idiv bl,AL = -9 AH = -3,除法指令,除法的溢出问题(超出寄存器范围) 除法的商过大导致目的操作数无法装载 使用更大的寄存器可以减少溢出的问题,汇编语言程序设计 - 朱明,14,DIV/IDIV reg/mem8 reg/mem16 reg/mem32,Section 3,mov ax, 1000h mov bl, 10h div bl,AL = 100h?,乘法和除法运算,使用汇编语言完成以下算术运算,汇编语言程序设计 - 朱明,15,Section 3,val4 = ( val1 + val2 ) *val3,val4 = ( val1 *5 ) / ( val2 - 3 ),val4 = ( val1 * (-5) / ( -val2 % 3 ),mov eax, val1 add eax, val2 mul val3 jc tooBig mov val4, eax jmp ;后面程序 tooBig: ;数据过大的处理,加法扩展,如何实现两个64位整数的加法运算? 64位模式下的RAX 加法扩展指令ADC ADC(Add with Carry)指令将源操作数、目的操作数以及进位标志位相加 0FFh + 0FFh = AL?可以保存? 0FFh + 0FFh = DL:AL,汇编语言程序设计 - 朱明,16,ADC reg, reg mem, reg reg, mem mem, imm reg, imm,Section 4,mov al, 0FFh add al, 0FFh,AL = FEh, CF = 1,adc dl, 0,DL = DL + 1,加法扩展,0FFFF FFFFh + 0FFFF FFFFh = EDX:EAX ADC指令在进行加法运算时,会将CF标志位也作为一个加数参与加法运算 通过加法扩展指令实现64位的加法运算? 结果保存在DWORD数组中,汇编语言程序设计 - 朱明,17,mov edx, 0 mov eax, 0FFFFFFFFh add eax, 0FFFFFFFFh,EAX = FFFF FFFEh CF = 1,adc edx, 0,EDX = 0000 0001h CF = 0,Section 4,加法扩展,两个64位数的定义 数据在内存中的存储与阶段运算,汇编语言程序设计 - 朱明,18,val1 QWORD 0A2B2 A406 7498 1234h val2 QWORD 08010 8700 0023 4502h sum DWORD 3 DUP(?),34,12,98,74,B2,A2,02,45,23,00,10,+,80,val1 ESI,val2 EDI,L1: mov eax, esi adc eax, edi pushfd mov ebx, eax add esi, 4 add edi, 4 add ebx, 4 popfd loop L1 adc ebx, 0 popad,sum EBX,+,Section 4,加法扩展,两个64位数的定义 数据在内存中的存储与阶段运算,汇编语言程序设计 - 朱明,19,val1 QWORD 0A2B2 A406 7498 1234h val2 QWORD 08010 8700 0023 4502h sum DWORD 3 DUP(?),34,12,98,74,B2,A2,02,45,23,00,10,+,80,val1 ESI,val2 EDI,main PROC mov esi, OFFSET val1 mov edi, OFFSET val2 mov ebx, OFFSET sum mov ecx, 2 call ;调用前面的过程 mov esi, OFFSET sum mov ebx, 4 mov ecx, 4 call DumpMems,sum EBX,+,Section 4,减法扩展,SBB指令从目的操作数中间去源操作数和进位标志位的值,其操作数与ADC相同 0000 0001 0000 0000h 1 = EAX:EDX 首先减去低32位,CF标志位置位 然后高32位减去CF标志位的值,汇编语言程序设计 - 朱明,20,SBB reg, reg mem, reg reg, mem mem, imm reg, imm,Section 4,mov edx, 0000 0001h mov eax, 0000 0000h sub eax, 0000 0001h,sbb edx, 0,EDX = 0000 0000h EAX = FFFF FFFFh,局部变量,C语言中的局部变量汇编语言中的局部变量 局部变量在单个过程中创建、使用并销毁 局部变量在堆栈上运行,汇编时不确定初始值但是在运行时进行初始化 LOCAL伪指令 LOCAL伪指令定义的变量列表需要占用堆栈空间 要保证堆栈中有足够的空间供局部变量使用,汇编语言程序设计 - 朱明,21,LOCAL 变量列表,LOCAL 标号:类型, 标号:列表 , 标号:列表,Section 5,LOCAL temp:DWORD, Flags:BYTE,局部变量,LOCAL伪指令定义的变量列表需要占用堆栈空间 需要为局部变量的保存准备保留的堆栈空间 使用STACK伪指令定义4096字节的堆栈空间 过程的嵌套调用会造成局部变量数量的叠加 Sub1+Sub2的局部变量将占用800字节的堆栈空间,汇编语言程序设计 - 朱明,22,.STACK 4096,Sub1 PROC LOCAL arr150:DWORD Sub2 PROC LOCAL arr2150:DWORD ,Section 5,局部变量与堆栈,堆栈与过程的调用(复习内容) 堆栈在过程调用中用来保存返回地址和现场数据,汇编语言程序设计 - 朱明,23,PA返回后地址 ,PA返回后地址,PB返回后地址,PB返回后地址 PA返回后地址 ,PC返回后地址 PB返回后地址 PA返回后地址 ,PB返回后地址 PA返回后地址 ,PA返回后地址 ,PC返回后地址 PB返回后地址 PA返回后地址 ,00000FF4,00000FF8,000000A5,00000FFC,00000006,00001000,ESP,Section 5,使用到了堆栈指针ESP ESP指向有效数据,以恢复现场,局部变量与堆栈*,但是有了一个问题局部变量也保存在堆栈上 这些变量也要占用堆栈空间,也需要一个指针 EBP(扩展帧指针寄存器)与局部变量 子过程被调用,前一个过程的返回地址压栈(ESP修改) 子过程开始,EBP也被压栈(ESP修改) EBP的值设定为ESP的值,EBP可以作为寻址子过程的基址指针而使用(EBP=ESP) 如果有局部变量,则ESP减去一个值,以便在堆栈上为局部变量保留空间(ESP修改) 如果任何寄存器需要保存,则压入堆栈(ESP修改),汇编语言程序设计 - 朱明,24,Section 5,局部变量与堆栈*,局部变量的空间开辟与EBP和ESP的关系 部分内容可以参考 ENTER指令 LEAVE指令 以上指令不作要求 *部分仅要求了解即可,汇编语言程序设计 - 朱明,25,void MySub() int X = 10; int Y = 20; ,push ebp mov ebp, esp sub esp, 8 mov DWORD PTR ebp-4, 10 mov DWORD PTR ebp-8, 20 mov esp, ebp pop ebp ret,小地址,Y,20,X,10,EBP,返回地址,大地址,EBP,EBP-4,EBP-8,ESP,Section 5,局部变量与存储*,在了解局部变量与堆栈的关系后看LOCAL伪指令 ESP减掉4以便给双字节的局部变量留出空间 BYTE依然占用4字节存储空间,汇编语言程序设计 - 朱明,26,Exam1 PROC LOCAL temp:DWORD mov eax, temp ret Exam1 ENDP,push ebp mov ebp, esp sub esp, 4 mov eax, ebp-4 mov esp, ebp pop ebp ret,小地址,temp,EBP,返回地址,大地址,EBP,EBP-4,ESP,Exam2 PROC LOCAL temp:BYTE mov al, temp ret Exam2 ENDP,小地址,大地址,NULL,NULL,NULL,temp,EBP,Section 5,EBP,EBP-4,ESP,EBP-1,递归,递归直接或者间接调用自身子过程 递归,必须要有一个终止条件 递归会涉及到过程的调用,至少要到用4字节的堆栈空间, 可能会占用处理器、占用内存并导致堆栈溢出 思考一下下面问题的解决 采用递归的方法求从n的阶乘 n! = n * (n-1) * (n-2) * * 3 * 2 * 1,汇编语言程序设计 - 朱明,27,int factorial(int n) if (n=0) return 1; else return n*factorial(n-1); ,Section 5,递归,要考虑的几个问题(假设使用局部变量传递参数) 局部变量的传递(获取前一次的n) if(n=0)的转换(判断递归结束) 递归的调用过程(L1标号),汇编语言程序设计 - 朱明,28,Section 5,push ebp mov ebp, esp mov eax, (1),(1) ebp+8,cmp eax, 0 (2);eax0则递归 mov eax, 1 jmp L2,(2) ja L1,(3);修改n值 (4);堆栈传递参数 call Factorial,(3) dec eax,(4) push eax,递归,要考虑的几个问题(假设使用局部变量传递参数) 如何进行乘法运算(MUL指令) 递归过程的返回(局部变量的删除,L2) 增加过程的定义和结束的内容,汇编语言程序设计 - 朱明,29,mov ebx, ebp+8 mul ebx,(5);恢复EBP的值 ret 4,(5) pop ebp,Factorial PROC . . Factorial ENDP,Section 5,递归,n的阶乘问题解决伪代码 该问题的解决方法中,使用了堆栈传递参数的方法 注意程序执行过程中堆栈的变化 使用上更简洁的参数传递方法?INVOKE,汇编语言程序设计 - 朱明,30,main PROC push 10 ;10的阶乘 call Factorial main ENDP END main,Factorial PROC ;局部变量传递 ;对于n的值的判定 ;递归过程的调用 ;乘法运算 ;递归过程的返回 Factorial ENDP,Section 5,INVOKE与PROC,INVOKE伪指令 调用一个名为AddTwo的过程,传递val1和val2参数 PROC伪指令的改进,汇编语言程序设计 - 朱明,31,INVOKE 过程名,参数列表,Section 6,立即数 10h, 3000h, OFFSET arr1 整数表达式 (10*20) 变量名 arr1, val1 地址表达式 esi, arr1esi 寄存器名 eax, ebx, ecx ADDR名 ADDR arr1,INVOKE AddTwo, val1, val2,AddTwo PROC, val1: BYTE, val2: BYTE,INVOKE与PROC,第一次作业的题目数组求和问题 将该程序结构化为一个主过程和一个字过程 主过程负责调用子过程并保存运算结果 子过程负责对数组各元素进行加法运算,汇编语言程序设计 - 朱明,32,arr1 DWORD 111h, 222h, 333h, 444h, 555h,ESI保存有数组的首地址,ECX保存数组的元素数目,调用数组加法运算子过程,EAX保存运算结果,获取EAX中的运算结果,Section 6,INVOKE与PROC,第一次作业的题目数组求和问题,汇编语言程序设计 - 朱明,33,mov eax, 0 L1: add eax, esi add esi, 4 loop L1,Section 6,核心数组加法运算代码,ArraySum PROC, offArr: DWORD sizeArr:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基金模拟实训报告总结
- 江苏省淮安市盱眙县2025-2026学年化学高二上期末综合测试模拟试题含解析
- 贵州省黔东南州锦屏县民族中学2026届高二上化学期末预测试题含解析
- 上海市戏剧学院附属中学2025年数学高二第一学期期末考试模拟试题含解析
- 急性肺栓塞实战演练
- 湿疹急性发作处理方案
- 外科创伤性胸腔出血处理指南
- 大学生职业规划
- 血液科白血病治疗方案分享
- 血液科慢性肾衰竭血液透析护理规范
- 2025年度安全生产工作述职报告范文
- 2025年北京市高职单独招生文化课统一考试(英语)
- 2025首都航空招飞面试题及答案
- 学校体育发展五年规划(2025.9-2030.9)
- 思想道德与法治(2023年版)电子版教材第一章 领悟人生真谛 把握人生方向
- 卖身合同范例
- GB/T 156-2017标准电压
- 第七章-金属基复合材料界面-表界面课件
- 清洁间歇导尿重点技术评分重点标准
- 制粉系统检修方案
- 《外科学》第七节 直肠癌
评论
0/150
提交评论