资源描述:
《汇编语言 第十一章 深入Windows汇编编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
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)关系运算符比
2、较数值表达式1和数值表达式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:.WH
4、ILE/.ENDW循环形式XOREAX,EAXXOREBX,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循环形式MOVE
5、CX,10XOREAX,EAXXOREBX,EBX.REPEATADDEAX,EBXINCEBX.UNTILCXZ11.2程序优化评价一个程序优劣的要素:实现思想是否合理清晰;书写风格是否符合规范;……程序的执行效率(重要)程序在多长的时间内能够完成(时间)程序需要多大的存储空间(空间)11.2.1运行时间的优化1.选择执行速度快的指令(1)寄存器清零MOVEAX,0SUBEAX,EAXXOREAX,EAX(2)加减。要使EBX=EAX30:LEAEBX,[EAX-30](3)乘除。求EAX=EAX
6、/16:SHREAX,4求EAX=EAX*8:SHLEAX,32.操作的转化设被除数为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
7、。(2)0>31)&(y-x))求两个数中的较大的数利用公式max(x,y)=x–(((x–y)>>(WORbyteITS–1))&(x–y))4.算法的优化举例:判断素数的算法一般思想:guess为要判断的数,把从2到guess-1中
8、每一个数作为除数,去除guess。如果商为0,则不是素数。优化:偶数不是素数,因此循环时可每次加2,且不取偶数,没有必要从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