版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、_06_整数运算指令与高级过程_2009年5月31日_ V1.1提问与回顾 第五章内容中我们介绍并练习了外部链接库中的一些常用过程 调用这些过程使用什么指令? 在逻辑运算部分内容中 AND指令用于进行逻辑与运算,但他在改变标志位的同时也改变了目的操作数,什么指令能够实现逻辑与运算功能但只改变标志位而不改变操作数? 同样,哪条指令与SUB类似但只改变标志位? 该条指令比较后,如相等则跳转,应使用什么指令? 尝试将下面的为指令转化成为汇编代码和决策伪指令汇编语言程序设计汇编语言程序设计 - 朱明朱明2if (bx cx) X=1; SHL(Shift Left),逻辑左移操作 最低位以0填充,最高
2、位传送到CF中 SHR(Shift Right),逻辑右移操作 最高位以0填充,最低位传送到CF中 左移和右移的意义:乘法和除法逻辑移位汇编语言程序设计汇编语言程序设计 - 朱明朱明3B7B6B5B4B3B2B1B00SHL/SHRreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5moval, 0D0hAL = 1101 0000bCF0shral, 1AL = 0110 1000bCF = 1逻辑移位 课堂练习题目位串分离 如果需要从一个字或者字节中的特定区域提取一系列位,这些位称为位串 例如文件的时间戳(文件最后访问时间)的分离汇编语言程序设计汇编
3、语言程序设计 - 朱明朱明40 0 1 0 0 1 1 00 1 1 0 1 0 1 0DHDLyearmonthdaymoval, dlandal, 01Fhmovday, almovax, dxshrax, 5andal, 0Fhmovmonth, almoval, dhshral, 1andah, 0haddax, 1980movyear, ax SAL(Shift Arithmetic Left),算术左移操作 最低位以0填充,最高位传送到CF中,同SHL SAR(Shift Arithmetic Right),算术右移操作 最高位以自身填充,最低位传送到CF中 右移的算术意义:有符号
4、数除法算术移位汇编语言程序设计汇编语言程序设计 - 朱明朱明5B7B6B5B4B3B2B1B00SAL/SARreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5moval, -128AL = 1000 0000bCFsaral, 4AL = 1111 1000b ROL(Rotate Left),循环左移操作 最低位以最高位填充,最高位传送到CF中 ROR(Rotate Right),循环右移操作 最高位以最低位填充,最低位传送到CF中 循环移位不丢弃数据 可用来将特定的位移入CF中循环移位汇编语言程序设计汇编语言程序设计 - 朱明朱明6B7B6B5B
5、4B3B2B1B0ROL/RORreg,imm8mem,imm8reg,CLmem,CLB7B6B4B3B2B1B0CFB5CF SHLD(Shift Left Double),双精度左移操作 目的操作数向左移指定位数 空位用源操作数的高位填充 源操作数不会有任何改变 SHRD(Shift Right Double) 目的操作数向右移指定位数 空位用源操作数的低位填充 源操作数不会有任何改变双精度移位汇编语言程序设计汇编语言程序设计 - 朱明朱明71001SHLD/SHLRreg16,reg16,CL/imm8mem16,reg16, CL/imm8reg32,reg32,CL/imm8mem
6、32,reg32, CL/imm81011 1010 01101001 1011 1010 0110bxaxmovbx, 9BA6hmovax, 0AC36hshldbx, ax, 4乘法指令 MUL无符号数乘法指令 8位、16位或32位被乘数依次为AL、AX或EAX 对应的乘数可以是尺寸相等的寄存器或内存 对应结果保存在AX、DX:AX、EDX:EAX中 CF标值位的影响高半部分如果不为0则CF位置位汇编语言程序设计汇编语言程序设计 - 朱明朱明8MULreg/mem8reg/mem16reg/mem32moveax, 12345hmovebx, 10000hmulebxEDX:EAX =
7、0000 0001 2345 0000hCF = 1乘法指令 IMUL有符号数乘法指令IMUL有单操作数、双操作数和三操作数三种格式 单操作数的情况与MUL相同 此时如果高半部分是结果的符号位扩展则OF=0汇编语言程序设计汇编语言程序设计 - 朱明朱明9moval, 48movbl, 4imulblAX = 00C0hOF = 1IMULreg/mem8reg/mem16reg/mem32moval, -4movbl, 4imulblAX = FFF0hOF = 0movax, 48movbx, 4imulbxDX = 0000hAX = 00C0hOF = 0乘法指令 IMUL有符号数乘法指
8、令 IMUL有单操作数、双操作数和三操作数三种格式 双操作数的乘积存储在第一个操作数中,但只能是寄存器,第二个操作数可以是寄存器、内存操作数或者立即数 三操作数的乘积存储在第一个操作数中,但只能是寄存器,第二操作数可以是寄存器或内存,第三操作数是立即数 要特别注意运算结果的尺寸问题:超出则CF和OF置位汇编语言程序设计汇编语言程序设计 - 朱明朱明10IMUL,双操作数reg16, reg/mem16reg16, imm8/16reg32, reg/mem32reg32, imm8/32IMUL,三操作数reg16,reg/mem16,imm8reg16,reg/mem16,imm16reg3
9、2,reg/mem32,imm8reg32,reg/mem32,imm32乘法指令 关于MUL和IMUL乘法的问题 传统意义上对于乘法运算是能少用就尽量少用 乘法的执行效率要低于移位操作的速度 理论上后一种方法的执行效率要远高于前一种方法 但是对于某些处理器则可能有所不同 老式的体系结构上,如Pentium4,比较会很明显 在嵌入式系统上,比较同样会很明显 在Core以上的体系结构上,比较结果不明显汇编语言程序设计汇编语言程序设计 - 朱明朱明11movebx, eaxshleax, 5shlebx, 2addeax, ebxmovebx, 36mulebx除法指令 DIV无符号数除法指令汇编
10、语言程序设计汇编语言程序设计 - 朱明朱明12DIVreg/mem8reg/mem16reg/mem32被除数除数商余数AXreg/mem8ALAHDX:AXreg/mem16AXDXEDX:EAXreg/mem32EAXEDXmovax, 83hmovbl, 2divblAL = 41hAH = 1movdx, 0movax, 8003movcx, 100divcxAX = 80DX = 3除法指令 IDIV有符号数除法指令 在进行除法指令前,应首先进行符号位扩展 符号位扩展用于将AL、AX和EAX的符号分别扩展至AH、DX和EDX中,以保证运算结果的符号正确汇编语言程序设计汇编语言程序设计
11、 - 朱明朱明13IDIVreg/mem8reg/mem16reg/mem32moval, -48cbwmovbl, 5idivblAL = -9AH = -3被除数除数商余数符号扩展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ除法指令 除法的溢出问题(超出寄存器范围) 除法的商过大导致目的操作数无法装载 使用更大的寄存器可以减少溢出的问题汇编语言程序设计汇编语言程序设计 - 朱明朱明14DIV/IDIVreg/mem8reg/mem16reg/mem32movax, 1000hmovbl, 10hdivblAL
12、 = 100h?被除数除数商余数符号扩展AXreg/mem8ALAHCWBDX:AXreg/mem16AXDXCWDEDX:EAXreg/mem32EAXEDXCDQ乘法和除法运算 使用汇编语言完成以下算术运算汇编语言程序设计汇编语言程序设计 - 朱明朱明15val4 = ( val1 + val2 ) *val3val4 = ( val1 *5 ) / ( val2 - 3 )val4 = ( val1 * (-5) / ( -val2 % 3 )moveax, val1addeax, val2mulval3jctooBigmovval4, eaxjmp;后面程序tooBig:;数据过大的处
13、理加法扩展 如何实现两个64位整数的加法运算? 64位模式下的RAX 加法扩展指令ADC ADC(Add with Carry)指令将源操作数、目的操作数以及进位标志位相加 0FFh + 0FFh = AL?可以保存? 0FFh + 0FFh = DL:AL汇编语言程序设计汇编语言程序设计 - 朱明朱明16ADCreg,regmem,regreg,memmem,immreg,immmoval, 0FFhaddal, 0FFhAL = FEh,CF = 1adcdl, 0DL = DL + 1加法扩展 0FFFF FFFFh + 0FFFF FFFFh = EDX:EAX ADC指令在进行加法运
14、算时,会将CF标志位也作为一个加数参与加法运算 通过加法扩展指令实现64位的加法运算? 结果保存在DWORD数组中汇编语言程序设计汇编语言程序设计 - 朱明朱明17movedx, 0moveax, 0FFFFFFFFhaddeax, 0FFFFFFFFhEAX = FFFF FFFEhCF = 1adcedx, 0EDX = 0000 0001hCF = 0加法扩展 两个64位数的定义 数据在内存中的存储与阶段运算汇编语言程序设计汇编语言程序设计 - 朱明朱明18val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWO
15、RD3 DUP(?)34129874B2A20245230010+80val1ESIval2EDIL1:moveax, esiadceax, edipushfdmovebx, eaxaddesi, 4addedi, 4addebx, 4popfdloopL1adcebx, 0popadsumEBX+加法扩展 两个64位数的定义 数据在内存中的存储与阶段运算汇编语言程序设计汇编语言程序设计 - 朱明朱明19val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWORD3 DUP(?)34129874B2A202452300
16、10+80val1ESIval2EDImainPROCmovesi, OFFSET val1movedi, OFFSET val2movebx, OFFSET summovecx, 2call;调用前面的过程movesi, OFFSET summovebx, 4movecx, 4callDumpMemssumEBX+减法扩展 SBB指令从目的操作数中间去源操作数和进位标志位的值,其操作数与ADC相同 0000 0001 0000 0000h 1 = EAX:EDX 首先减去低32位,CF标志位置位 然后高32位减去CF标志位的值汇编语言程序设计汇编语言程序设计 - 朱明朱明20SBBreg,r
17、egmem,regreg,memmem,immreg,immmovedx, 0000 0001hmoveax, 0000 0000hsubeax, 0000 0001hsbbedx, 0EDX = 0000 0000hEAX = FFFF FFFFh局部变量 C语言中的局部变量汇编语言中的局部变量 局部变量在单个过程中创建、使用并销毁 局部变量在堆栈上运行,汇编时不确定初始值但是在运行时进行初始化 LOCAL伪指令 LOCAL伪指令定义的变量列表需要占用堆栈空间 要保证堆栈中有足够的空间供局部变量使用汇编语言程序设计汇编语言程序设计 - 朱明朱明21LOCAL变量列表LOCAL标号:类型, 标
18、号:列表 , 标号:列表LOCALtemp:DWORD, Flags:BYTE局部变量 LOCAL伪指令定义的变量列表需要占用堆栈空间 需要为局部变量的保存准备保留的堆栈空间 使用STACK伪指令定义4096字节的堆栈空间 过程的嵌套调用会造成局部变量数量的叠加 Sub1+Sub2的局部变量将占用800字节的堆栈空间汇编语言程序设计汇编语言程序设计 - 朱明朱明22.STACK4096Sub1 PROCLOCALarr150:DWORDSub2 PROCLOCALarr2150:DWORD局部变量与堆栈 堆栈与过程的调用(复习内容) 堆栈在过程调用中用来保存返回地址和现场数据汇编语言程序设计汇
19、编语言程序设计 - 朱明朱明23PA返回后地址PA返回后地址PB返回后地址PB返回后地址PA返回后地址PC返回后地址PB返回后地址PA返回后地址PB返回后地址PA返回后地址PA返回后地址PC返回后地址PB返回后地址PA返回后地址00000FF400000FF8000000A500000FFCESP 使用到了堆栈指针ESP ESP指向有效数据,以恢复现场局部变量与堆栈* 但是有了一个问题局部变量也保存在堆栈上 这些变量也要占用堆栈空间,也需要一个指针 EBP(扩展帧指针寄存器)与局部变量 子过程被调用,前一个过程的返回地址压栈(ESP修改) 子过程开始,EBP也被压栈(ESP修改) EBP的值设
20、定为ESP的值,EBP可以作为寻址子过程的基址指针而使用(EBP=ESP) 如果有局部变量,则ESP减去一个值,以便在堆栈上为局部变量保留空间(ESP修改) 如果任何寄存器需要保存,则压入堆栈(ESP修改)汇编语言程序设计汇编语言程序设计 - 朱明朱明24局部变量与堆栈* 局部变量的空间开辟与EBP和ESP的关系部分内容可以参考 ENTER指令 LEAVE指令 以上指令不作要求 *部分仅要求了解即可汇编语言程序设计汇编语言程序设计 - 朱明朱明25void MySub() int X = 10;int Y = 20;pushebpmovebp, espsubesp, 8movDWORD PTR
21、 ebp-4, 10movDWORD PTR ebp-8, 20movesp, ebppopebpret小地址Y,20X,10EBP返回地址大地址EBPEBP-4EBP-8ESP局部变量与存储* 在了解局部变量与堆栈的关系后看LOCAL伪指令 ESP减掉4以便给双字节的局部变量留出空间 BYTE依然占用4字节存储空间汇编语言程序设计汇编语言程序设计 - 朱明朱明26Exam1PROCLOCALtemp:DWORDmoveax, tempretExam1ENDPpushebpmovebp, espsubesp, 4moveax, ebp-4movesp, ebppopebpret小地址tempE
22、BP返回地址大地址EBPEBP-4ESPExam2PROCLOCALtemp:BYTEmoval, tempretExam2ENDP小地址大地址NULLNULLNULLtempEBPEBPEBP-4ESPEBP-1递归 递归直接或者间接调用自身子过程 递归,必须要有一个终止条件 递归会涉及到过程的调用,至少要到用4字节的堆栈空间, 可能会占用处理器、占用内存并导致堆栈溢出 思考一下下面问题的解决 采用递归的方法求从n的阶乘 n! = n * (n-1) * (n-2) * * 3 * 2 * 1汇编语言程序设计汇编语言程序设计 - 朱明朱明27int factorial(int n) if (
23、n=0)return 1;elsereturn n*factorial(n-1);递归 要考虑的几个问题(假设使用局部变量传递参数) 局部变量的传递(获取前一次的n) if(n=0)的转换(判断递归结束) 递归的调用过程(L1标号)汇编语言程序设计汇编语言程序设计 - 朱明朱明28pushebpmovebp, espmoveax, (1)(1) ebp+8cmpeax, 0(2);eax0则递归moveax, 1jmpL2(2) ja L1(3);修改n值(4);堆栈传递参数callFactorial(3) dec eax(4) push eax递归 要考虑的几个问题(假设使用局部变量传递参数
24、) 如何进行乘法运算(MUL指令)递归过程的返回(局部变量的删除,L2) 增加过程的定义和结束的内容汇编语言程序设计汇编语言程序设计 - 朱明朱明29movebx, ebp+8mulebx(5);恢复EBP的值ret4(5) pop ebpFactorial PROC.Factorial ENDP递归 n的阶乘问题解决伪代码 该问题的解决方法中,使用了堆栈传递参数的方法 注意程序执行过程中堆栈的变化 使用上更简洁的参数传递方法?INVOKE汇编语言程序设计汇编语言程序设计 - 朱明朱明30mainPROCpush10;10的阶乘call FactorialmainENDPENDmainFact
25、orial PROC;局部变量传递;对于n的值的判定;递归过程的调用;乘法运算;递归过程的返回Factorial ENDPINVOKE与PROC INVOKE伪指令 调用一个名为AddTwo的过程,传递val1和val2参数 PROC伪指令的改进汇编语言程序设计汇编语言程序设计 - 朱明朱明31INVOKE过程名,参数列表立即数10h, 3000h, OFFSET arr1整数表达式(10*20)变量名arr1, val1地址表达式esi, arr1esi寄存器名eax, ebx, ecxADDR名ADDRarr1INVOKEAddTwo, val1, val2AddTwoPROC,val1:
26、 BYTE,val2: BYTEINVOKE与PROC 第一次作业的题目数组求和问题 将该程序结构化为一个主过程和一个字过程 主过程负责调用子过程并保存运算结果 子过程负责对数组各元素进行加法运算汇编语言程序设计汇编语言程序设计 - 朱明朱明32arr1 DWORD 111h, 222h, 333h, 444h, 555hESI保存有数组的首地址ECX保存数组的元素数目调用数组加法运算子过程EAX保存运算结果获取EAX中的运算结果INVOKE与PROC第一次作业的题目数组求和问题汇编语言程序设计汇编语言程序设计 - 朱明朱明33moveax, 0L1:addeax, esiaddesi, 4loopL1核心数组加法运算代码ArraySumPROC,offArr: DWORDsizeArr: DWOR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年西安科技大学高新学院单招职业适应性考试必刷测试卷及答案1套
- 2026年福建艺术职业学院单招职业适应性测试题库必考题
- 2026年通化医药健康职业学院单招职业适应性测试题库及答案1套
- 2026年山东职业学院单招职业技能考试必刷测试卷及答案1套
- 2026年铜川职业技术学院单招职业适应性测试必刷测试卷必考题
- 2026年甘肃省张掖地区单招职业适应性测试必刷测试卷附答案
- 2026年黑龙江护理高等专科学校单招职业技能测试题库附答案
- 2026年河南省信阳市单招职业适应性考试必刷测试卷附答案
- 2026年上海兴伟学院单招职业技能测试必刷测试卷必考题
- 2026年益阳医学高等专科学校单招职业倾向性测试题库新版
- 餐饮五常法课件
- 动火作业安全技术措施专项施工方案
- 拆除人行道施工方案
- 2025年中级经济师经济基础知识真题解析与答案
- 角磨机安全教育培训课件
- 财政投资评审业务课件
- 兽药安全使用及配伍禁忌快速查阅表
- 矿建监理岗前安全培训课件
- 新时代乡村治理培训课件
- Unit 4 Amazing Plants and Animals 大单元整体公开课一等奖创新教学设计(表格式)
- 道路绿化施工的重点难点分析及措施
评论
0/150
提交评论