欢迎来到天天文库
浏览记录
ID:19416658
大小:246.00 KB
页数:37页
时间:2018-10-02
《ch 深入windows汇编编程课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十一章深入Windows汇编编程11.1汇编高级语法11.2程序优化11.3文件操作11.4结构化异常处理11.1汇编高级语法汇编语言语法问题:分支和循环程序结构存在标号定义和程序流程复杂的问题可读性、简洁性、可维护性不如高级语言编写汇编程序时比较烦琐MASM引入了一系列伪指令来实现条件测试、分支和循环语句等。11.1.1条件测试表达式条件测试表达式的形式:1.寄存器或内存变量例如:x;x不等0时为真EAX;EAX不等于0时为真2.利用关系运算符(数值表达式1)关系运算符(数值表达式2)关系运算符比较数值表达式1
2、和数值表达式2的内容关系运算符列表3.利用逻辑运算符(关系或数值表达式1)逻辑运算符(关系或数值表达式2)逻辑运算符对表达式进行逻辑运算。逻辑运算符和关系运算符的语法基本和C语言基本类似。逻辑运算符列表4.根据标志寄存器中的各种标志位符号11.1.2分支伪操作分支语句根据条件表达式的真假执行不同的代码模块,与C语言的if/elseif/else/endif相似。语法如下:.IF条件表达式1表达式1为“真”时执行的指令[.ELSEIF条件表达式2表达式2为“真”时执行的指令][.ELSE上述条件均不满足时执行的指令]
3、.ENDIF11.1.3循环伪操作循环是重复执行的一组指令,分3种:1.WHILE-ENDW循环.WHILE条件测试表达式循环体.ENDW2.REPEAT-UNTIL循环:.REPEAT循环体.UNTIL条件测试表达式3.REPEAT-UNTILCXZ循环.REPEAT循环体.UNTILCXZ[条件测试表达式]使用.BREAK语句可以跳出循环。格式:.BREAK[.IF退出条件]使用.CONTINUE语句可以跳到循环体的最后。计算0+1+2+…+8+9的几个例子例1:.WHILE/.ENDW循环形式XOREAX,E
4、AXXOREBX,EBX.WHILEEBX<10ADDEAX,EBXINCEBX.ENDW例2:用.BREAK语句来终止循环XOREAX,EAXXOREBX,EBX.WHILE1ADDEAX,EBXINCEBX.BREAK.IFEBX>=10.ENDW例3:.REPEAT/.UNTIL循环的形式XOREAX,EAXXOREBX,EBX.REPEATADDEAX,EBXINCEBX.UNTILEBX>=10例4:.REPEAT/.UNTILCXZ循环形式MOVECX,10XOREAX,EAXXOREBX,EBX.RE
5、PEATADDEAX,EBXINCEBX.UNTILCXZ11.2程序优化评价一个程序优劣的要素:实现思想是否合理清晰;书写风格是否符合规范;……程序的执行效率(重要)程序在多长的时间内能够完成(时间)程序需要多大的存储空间(空间)11.2.1运行时间的优化1.选择执行速度快的指令(1)寄存器清零MOVEAX,0SUBEAX,EAXXOREAX,EAX(2)加减。要使EBX=EAX30:LEAEBX,[EAX-30](3)乘除。求EAX=EAX/16:SHREAX,4求EAX=EAX*8:SHLEAX,32.操作
6、的转化设被除数为a,除数为b,商为c,余数为d,均为32位二进制数;a÷b=c余d,即a=bc+d;记L=232=100000000H,求出M=(L+(b–1))÷b,则c=aM/L设:L÷b=emodf,L=be+f分两种情况:(1)f=0,即L能被b整除,M=(L+(b–1)÷b=L/b=e;aM=a(L/b)=((bc+d)L/b)=cL+(dL/b)a乘以M后,结果是64位数,高32位数就是c,即EDX。低32位数为dL/b。(2)07、1;同理可求:a乘以M后,结果是64位数,高32位数就是c,即EDX。低32位数为de+(b-f)c+d。3.求两个数中的较小的数求两个数中的较小的数利用公式min(x,y)=x+(((y–x)>>31)&(y-x))求两个数中的较大的数利用公式max(x,y)=x–(((x–y)>>(WORbyteITS–1))&(x–y))4.算法的优化举例:判断素数的算法一般思想:guess为要判断的数,把从2到guess-1中每一个数作为除数,去除guess。如果商为0,则不是素数。优化:偶数不是素数,因此循环时可每次加28、,且不取偶数,没有必要从3到guess取值,只需取到guess开方值程序prime.asm(P364)。5.查表法要将十六进制数字0~15转换为‘0’~‘9’、‘A’~‘F’。分析:如果al的初值为0~9,jbe指令会发生跳转,得到‘0’~‘9’。如果al的初值为10~15,则JBE指令不会跳转,得到‘A’~‘F’。指令:HexCharsBYTE'01234
7、1;同理可求:a乘以M后,结果是64位数,高32位数就是c,即EDX。低32位数为de+(b-f)c+d。3.求两个数中的较小的数求两个数中的较小的数利用公式min(x,y)=x+(((y–x)>>31)&(y-x))求两个数中的较大的数利用公式max(x,y)=x–(((x–y)>>(WORbyteITS–1))&(x–y))4.算法的优化举例:判断素数的算法一般思想:guess为要判断的数,把从2到guess-1中每一个数作为除数,去除guess。如果商为0,则不是素数。优化:偶数不是素数,因此循环时可每次加2
8、,且不取偶数,没有必要从3到guess取值,只需取到guess开方值程序prime.asm(P364)。5.查表法要将十六进制数字0~15转换为‘0’~‘9’、‘A’~‘F’。分析:如果al的初值为0~9,jbe指令会发生跳转,得到‘0’~‘9’。如果al的初值为10~15,则JBE指令不会跳转,得到‘A’~‘F’。指令:HexCharsBYTE'01234
此文档下载收益归作者所有