汇编语言程序设计06整数运算指令与高级过程.ppt

上传人:牧羊曲112 文档编号:6399788 上传时间:2023-10-27 格式:PPT 页数:36 大小:2.81MB
返回 下载 相关 举报
汇编语言程序设计06整数运算指令与高级过程.ppt_第1页
第1页 / 共36页
汇编语言程序设计06整数运算指令与高级过程.ppt_第2页
第2页 / 共36页
汇编语言程序设计06整数运算指令与高级过程.ppt_第3页
第3页 / 共36页
汇编语言程序设计06整数运算指令与高级过程.ppt_第4页
第4页 / 共36页
汇编语言程序设计06整数运算指令与高级过程.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《汇编语言程序设计06整数运算指令与高级过程.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计06整数运算指令与高级过程.ppt(36页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计,_06_整数运算指令与高级过程大连理工大学软件学院_朱明2009年5月31日_ V1.1,提问与回顾,第五章内容中我们介绍并练习了外部链接库中的一些常用过程 调用这些过程使用什么指令?在逻辑运算部分内容中 AND指令用于进行逻辑与运算,但他在改变标志位的同时也改变了目的操作数,什么指令能够实现逻辑与运算功能但只改变标志位而不改变操作数?同样,哪条指令与SUB类似但只改变标志位?该条指令比较后,如相等则跳转,应使用什么指令?尝试将下面的为指令转化成为汇编代码和决策伪指令,汇编语言程序设计-朱明,2,if(bx cx)X=1;,提问与回顾,SHL(Shift Left),逻辑左移

2、操作 最低位以0填充,最高位传送到CF中 SHR(Shift Right),逻辑右移操作 最高位以0填充,最低位传送到CF中 左移和右移的意义:乘法和除法,逻辑移位,汇编语言程序设计-朱明,3,SHL/SHRreg,imm8mem,imm8reg,CLmem,CL,moval,0D0h,AL=1101 0000b,shral,1,AL=0110 1000b,CF=1,Section 1,逻辑移位,课堂练习题目位串分离 如果需要从一个字或者字节中的特定区域提取一系列位,这些位称为位串 例如文件的时间戳(文件最后访问时间)的分离,汇编语言程序设计-朱明,4,Section 1,DH,DL,year

3、,month,day,moval,dlandal,01Fhmovday,al,movax,dxshrax,5andal,0Fhmovmonth,al,moval,dhshral,1andah,0haddax,1980movyear,ax,SAL(Shift Arithmetic Left),算术左移操作 最低位以0填充,最高位传送到CF中,同SHL SAR(Shift Arithmetic Right),算术右移操作 最高位以自身填充,最低位传送到CF中 右移的算术意义:有符号数除法,算术移位,汇编语言程序设计-朱明,5,SAL/SARreg,imm8mem,imm8reg,CLmem,CL,

4、moval,-128,AL=1000 0000b,saral,4,AL=1111 1000b,Section 1,ROL(Rotate Left),循环左移操作 最低位以最高位填充,最高位传送到CF中 ROR(Rotate Right),循环右移操作 最高位以最低位填充,最低位传送到CF中 循环移位不丢弃数据 可用来将特定的位移入CF中,循环移位,汇编语言程序设计-朱明,6,ROL/RORreg,imm8mem,imm8reg,CLmem,CL,Section 1,SHLD(Shift Left Double),双精度左移操作 目的操作数向左移指定位数 空位用源操作数的高位填充 源操作数不会有

5、任何改变 SHRD(Shift Right Double)目的操作数向右移指定位数 空位用源操作数的低位填充 源操作数不会有任何改变,双精度移位,汇编语言程序设计-朱明,7,SHLD/SHLRreg16,reg16,CL/imm8mem16,reg16,CL/imm8reg32,reg32,CL/imm8mem32,reg32,CL/imm8,Section 1,bx,ax,movbx,9BA6hmovax,0AC36hshldbx,ax,4,乘法指令,MUL无符号数乘法指令 8位、16位或32位被乘数依次为AL、AX或EAX 对应的乘数可以是尺寸相等的寄存器或内存 对应结果保存在AX、DX:

6、AX、EDX:EAX中 CF标值位的影响高半部分如果不为0则CF位置位,汇编语言程序设计-朱明,8,MULreg/mem8reg/mem16reg/mem32,Section 2,moveax,12345hmovebx,10000hmulebx,EDX:EAX=0000 0001 2345 0000hCF=1,乘法指令,IMUL有符号数乘法指令IMUL有单操作数、双操作数和三操作数三种格式 单操作数的情况与MUL相同 此时如果高半部分是结果的符号位扩展则OF=0,汇编语言程序设计-朱明,9,moval,48movbl,4imulbl,AX=00C0hOF=1,IMULreg/mem8reg/m

7、em16reg/mem32,moval,-4movbl,4imulbl,AX=FFF0hOF=0,movax,48movbx,4imulbx,DX=0000hAX=00C0hOF=0,Section 2,乘法指令,IMUL有符号数乘法指令 IMUL有单操作数、双操作数和三操作数三种格式 双操作数的乘积存储在第一个操作数中,但只能是寄存器,第二个操作数可以是寄存器、内存操作数或者立即数 三操作数的乘积存储在第一个操作数中,但只能是寄存器,第二操作数可以是寄存器或内存,第三操作数是立即数 要特别注意运算结果的尺寸问题:超出则CF和OF置位,汇编语言程序设计-朱明,10,Section 2,IMUL

8、,双操作数reg16,reg/mem16reg16,imm8/16reg32,reg/mem32reg32,imm8/32,IMUL,三操作数reg16,reg/mem16,imm8reg16,reg/mem16,imm16reg32,reg/mem32,imm8reg32,reg/mem32,imm32,乘法指令,关于MUL和IMUL乘法的问题 传统意义上对于乘法运算是能少用就尽量少用 乘法的执行效率要低于移位操作的速度 理论上后一种方法的执行效率要远高于前一种方法 但是对于某些处理器则可能有所不同 老式的体系结构上,如Pentium4,比较会很明显 在嵌入式系统上,比较同样会很明显 在Co

9、re以上的体系结构上,比较结果不明显,汇编语言程序设计-朱明,11,Section 2,movebx,eaxshleax,5shlebx,2addeax,ebx,movebx,36mulebx,除法指令,DIV无符号数除法指令,汇编语言程序设计-朱明,12,DIVreg/mem8reg/mem16reg/mem32,Section 3,movax,83hmovbl,2divbl,AL=41hAH=1,movdx,0movax,8003movcx,100divcx,AX=80DX=3,除法指令,IDIV有符号数除法指令 在进行除法指令前,应首先进行符号位扩展 符号位扩展用于将AL、AX和EAX的

10、符号分别扩展至AH、DX和EDX中,以保证运算结果的符号正确,汇编语言程序设计-朱明,13,IDIVreg/mem8reg/mem16reg/mem32,Section 3,moval,-48cbwmovbl,5idivbl,AL=-9AH=-3,除法指令,除法的溢出问题(超出寄存器范围)除法的商过大导致目的操作数无法装载 使用更大的寄存器可以减少溢出的问题,汇编语言程序设计-朱明,14,DIV/IDIVreg/mem8reg/mem16reg/mem32,Section 3,movax,1000hmovbl,10hdivbl,AL=100h?,乘法和除法运算,使用汇编语言完成以下算术运算,汇

11、编语言程序设计-朱明,15,Section 3,val4=(val1+val2)*val3,val4=(val1*5)/(val2-3),val4=(val1*(-5)/(-val2%3),moveax,val1addeax,val2mulval3jctooBigmovval4,eaxjmp;后面程序tooBig:;数据过大的处理,加法扩展,如何实现两个64位整数的加法运算?64位模式下的RAX 加法扩展指令ADC ADC(Add with Carry)指令将源操作数、目的操作数以及进位标志位相加 0FFh+0FFh=AL?可以保存?0FFh+0FFh=DL:AL,汇编语言程序设计-朱明,16

12、,ADCreg,regmem,regreg,memmem,immreg,imm,Section 4,moval,0FFhaddal,0FFh,AL=FEh,CF=1,adcdl,0,DL=DL+1,加法扩展,0FFFF FFFFh+0FFFF FFFFh=EDX:EAX ADC指令在进行加法运算时,会将CF标志位也作为一个加数参与加法运算 通过加法扩展指令实现64位的加法运算?结果保存在DWORD数组中,汇编语言程序设计-朱明,17,movedx,0moveax,0FFFFFFFFhaddeax,0FFFFFFFFh,EAX=FFFF FFFEhCF=1,adcedx,0,EDX=0000 0

13、001hCF=0,Section 4,加法扩展,两个64位数的定义 数据在内存中的存储与阶段运算,汇编语言程序设计-朱明,18,val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWORD3 DUP(?),34,12,98,74,B2,A2,02,45,23,00,10,+,80,val1ESI,val2EDI,L1:moveax,esiadceax,edipushfdmovebx,eaxaddesi,4addedi,4addebx,4popfdloopL1adcebx,0popad,sumEBX,+,Section

14、4,加法扩展,两个64位数的定义 数据在内存中的存储与阶段运算,汇编语言程序设计-朱明,19,val1QWORD0A2B2 A406 7498 1234hval2QWORD08010 8700 0023 4502hsumDWORD3 DUP(?),34,12,98,74,B2,A2,02,45,23,00,10,+,80,val1ESI,val2EDI,mainPROCmovesi,OFFSET val1movedi,OFFSET val2movebx,OFFSET summovecx,2call;调用前面的过程movesi,OFFSET summovebx,4movecx,4callDump

15、Mems,sumEBX,+,Section 4,减法扩展,SBB指令从目的操作数中间去源操作数和进位标志位的值,其操作数与ADC相同 0000 0001 0000 0000h 1=EAX:EDX 首先减去低32位,CF标志位置位 然后高32位减去CF标志位的值,汇编语言程序设计-朱明,20,SBBreg,regmem,regreg,memmem,immreg,imm,Section 4,movedx,0000 0001hmoveax,0000 0000hsubeax,0000 0001h,sbbedx,0,EDX=0000 0000hEAX=FFFF FFFFh,局部变量,C语言中的局部变量汇

16、编语言中的局部变量 局部变量在单个过程中创建、使用并销毁 局部变量在堆栈上运行,汇编时不确定初始值但是在运行时进行初始化 LOCAL伪指令 LOCAL伪指令定义的变量列表需要占用堆栈空间 要保证堆栈中有足够的空间供局部变量使用,汇编语言程序设计-朱明,21,LOCAL变量列表,LOCAL标号:类型,标号:列表,标号:列表,Section 5,LOCALtemp:DWORD,Flags:BYTE,局部变量,LOCAL伪指令定义的变量列表需要占用堆栈空间 需要为局部变量的保存准备保留的堆栈空间 使用STACK伪指令定义4096字节的堆栈空间 过程的嵌套调用会造成局部变量数量的叠加 Sub1+Sub

17、2的局部变量将占用800字节的堆栈空间,汇编语言程序设计-朱明,22,.STACK4096,Sub1 PROCLOCALarr150:DWORDSub2 PROCLOCALarr2150:DWORD,Section 5,局部变量与堆栈,堆栈与过程的调用(复习内容)堆栈在过程调用中用来保存返回地址和现场数据,汇编语言程序设计-朱明,23,PA返回后地址,PA返回后地址,PB返回后地址,PB返回后地址PA返回后地址,PC返回后地址PB返回后地址PA返回后地址,PB返回后地址PA返回后地址,PA返回后地址,PC返回后地址PB返回后地址PA返回后地址,00000FF4,00000FF8,000000A

18、5,00000FFC,00000006,00001000,ESP,Section 5,使用到了堆栈指针ESP ESP指向有效数据,以恢复现场,局部变量与堆栈*,但是有了一个问题局部变量也保存在堆栈上 这些变量也要占用堆栈空间,也需要一个指针 EBP(扩展帧指针寄存器)与局部变量 子过程被调用,前一个过程的返回地址压栈(ESP修改)子过程开始,EBP也被压栈(ESP修改)EBP的值设定为ESP的值,EBP可以作为寻址子过程的基址指针而使用(EBP=ESP)如果有局部变量,则ESP减去一个值,以便在堆栈上为局部变量保留空间(ESP修改)如果任何寄存器需要保存,则压入堆栈(ESP修改),汇编语言程序

19、设计-朱明,24,Section 5,局部变量与堆栈*,局部变量的空间开辟与EBP和ESP的关系部分内容可以参考 ENTER指令 LEAVE指令 以上指令不作要求*部分仅要求了解即可,汇编语言程序设计-朱明,25,void MySub()int X=10;int Y=20;,pushebpmovebp,espsubesp,8movDWORD PTR ebp-4,10movDWORD PTR ebp-8,20movesp,ebppopebpret,小地址,Y,20,X,10,EBP,返回地址,大地址,EBP,EBP-4,EBP-8,ESP,Section 5,局部变量与存储*,在了解局部变量与堆

20、栈的关系后看LOCAL伪指令 ESP减掉4以便给双字节的局部变量留出空间 BYTE依然占用4字节存储空间,汇编语言程序设计-朱明,26,Exam1PROCLOCALtemp:DWORDmoveax,tempretExam1ENDP,pushebpmovebp,espsubesp,4moveax,ebp-4movesp,ebppopebpret,小地址,temp,EBP,返回地址,大地址,EBP,EBP-4,ESP,Exam2PROCLOCALtemp:BYTEmoval,tempretExam2ENDP,小地址,大地址,NULL,NULL,NULL,temp,EBP,Section 5,EBP

21、,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;elsereturn n*factorial(n-1);,Section 5,递归,要考虑的几个问题(假设使用局部变量传递参数)局部变量的传递(获取前一次的n)if(n=0)的转换(判断递归结束)递归的调用

22、过程(L1标号),汇编语言程序设计-朱明,28,Section 5,pushebpmovebp,espmoveax,(1),(1)ebp+8,cmpeax,0(2);eax0则递归moveax,1jmpL2,(2)ja L1,(3);修改n值(4);堆栈传递参数callFactorial,(3)dec eax,(4)push eax,递归,要考虑的几个问题(假设使用局部变量传递参数)如何进行乘法运算(MUL指令)递归过程的返回(局部变量的删除,L2)增加过程的定义和结束的内容,汇编语言程序设计-朱明,29,movebx,ebp+8mulebx,(5);恢复EBP的值ret4,(5)pop eb

23、p,Factorial PROC.Factorial ENDP,Section 5,递归,n的阶乘问题解决伪代码 该问题的解决方法中,使用了堆栈传递参数的方法 注意程序执行过程中堆栈的变化 使用上更简洁的参数传递方法?INVOKE,汇编语言程序设计-朱明,30,mainPROCpush10;10的阶乘call FactorialmainENDPENDmain,Factorial PROC;局部变量传递;对于n的值的判定;递归过程的调用;乘法运算;递归过程的返回Factorial ENDP,Section 5,INVOKE与PROC,INVOKE伪指令 调用一个名为AddTwo的过程,传递val

24、1和val2参数 PROC伪指令的改进,汇编语言程序设计-朱明,31,INVOKE过程名,参数列表,Section 6,立即数10h,3000h,OFFSET arr1整数表达式(10*20)变量名arr1,val1地址表达式esi,arr1esi寄存器名eax,ebx,ecxADDR名ADDRarr1,INVOKEAddTwo,val1,val2,AddTwoPROC,val1:BYTE,val2:BYTE,INVOKE与PROC,第一次作业的题目数组求和问题 将该程序结构化为一个主过程和一个字过程 主过程负责调用子过程并保存运算结果 子过程负责对数组各元素进行加法运算,汇编语言程序设计-朱

25、明,32,arr1 DWORD 111h,222h,333h,444h,555h,ESI保存有数组的首地址,ECX保存数组的元素数目,调用数组加法运算子过程,EAX保存运算结果,获取EAX中的运算结果,Section 6,INVOKE与PROC,第一次作业的题目数组求和问题,汇编语言程序设计-朱明,33,moveax,0L1:addeax,esiaddesi,4loopL1,Section 6,核心数组加法运算代码,ArraySumPROC,offArr:DWORDsizeArr:DWORD,popesi,ecxretArraySum ENDP,子过程返回和定义,push esi,ecxmov

26、 esi,offArrmov ecx,sizeArr,使用获得的参数,定义带有参数传递的过程,哦?使用USES伪指令可以简化现场的保护和恢复过程,在PROC,后加入USES esi,ecx即可以省去程序中对于使用到的寄存器的push压栈和pop弹栈,INVOKE与PROC,第一次作业的题目数组求和问题 INVOKE极大的简化了参数的传递过程 通过堆栈传递参数比通过寄存器传递要更容易使用 简化了通过堆栈传递参数的细节问题 带有参数的PROC位指令定义的过程 汇编器会自动修改ret指令的内容,汇编语言程序设计-朱明,34,Section 6,.data.codemainPROCINVOKEArra

27、ySum,OFFSET arr1,LENGTHOF arr1movresults,eaxmainENDPENDmain,主过程实现带有参数传递的调用,章节回顾,三种移位指令:逻辑移位,算术移位和循环移位 三种移位的特点以及与CF位的关系 无符号数的乘法指令MUL 乘数、被乘数以及运算结果的保存 有符号数乘法指令IMUL 三种格式以及对应的结果保存 加法扩展指令与减法扩展指令 局部变量与堆栈*递归运算方法 带有参数传递的过程INVOKE和PROC伪指令,汇编语言程序设计-朱明,35,章节回顾,章节回顾,以下的问题我们应当轻松回答 逻辑右移指令(SHR)和算数右移指令(SAR)在移位时最高位以什么填充,最低位移出至何处?在使用双精度移位指令时,源操作数和目的操作数分别会发生什么样的变化?MUL进行32位无符号数乘法运算时,结果如何保存?ADC指令进行扩展加法运算时,除了将源操作数和目的操作数相加外,还会考虑什么因素?LOCAL伪指令可以为过程定义定义局部变量,局部变量在程序运行过程中保存在什么地方?相对于CALL指令,使用INVOKE伪指令进行过程调用有什么明显好处?,汇编语言程序设计-朱明,36,章节回顾,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号