Ch11 深入Windows汇编编程.ppt
汇编语言程序设计汇编语言程序设计第十一章第十一章第十一章第十一章 深入深入深入深入WindowsWindowsWindowsWindows汇编编程汇编编程汇编编程汇编编程 11.1 11.1 汇编高级语法汇编高级语法11.2 11.2 程序优化程序优化11.3 11.3 文件操作文件操作11.4 11.4 结构化异常处理结构化异常处理11.1 11.1 汇编高级语法汇编高级语法 汇编语言语法问题汇编语言语法问题:l l分支和循环程序结构存在标号定义和程序流程复杂的问分支和循环程序结构存在标号定义和程序流程复杂的问分支和循环程序结构存在标号定义和程序流程复杂的问分支和循环程序结构存在标号定义和程序流程复杂的问题题题题 l l可读性、简洁性、可维护性不如高级语言编写汇编程序可读性、简洁性、可维护性不如高级语言编写汇编程序可读性、简洁性、可维护性不如高级语言编写汇编程序可读性、简洁性、可维护性不如高级语言编写汇编程序时比较烦琐时比较烦琐时比较烦琐时比较烦琐l lMASMMASMMASMMASM引入了一系列伪指令来实现条件测试、分支和循环引入了一系列伪指令来实现条件测试、分支和循环引入了一系列伪指令来实现条件测试、分支和循环引入了一系列伪指令来实现条件测试、分支和循环语句等。语句等。语句等。语句等。11.1.1 11.1.1 条件测试表达式条件测试表达式条件测试表达式的形式条件测试表达式的形式 :1.1.寄存器或内存变量寄存器或内存变量例如:例如:x x ;x x不等不等0 0时为真时为真 EAX EAX ;EAXEAX不等于不等于0 0时为真时为真2.2.利用关系运算符利用关系运算符(数值表达式数值表达式1)1)关系运算符关系运算符(数值表达式数值表达式2)2)关关系系运运算算符符比比较较数数值值表表达达式式1 1和和数数值值表表达达式式2 2的内容的内容关系运算符列表关系运算符列表3.3.利用逻辑运算符利用逻辑运算符 (关系或数值表达式关系或数值表达式1)1)逻辑运算符逻辑运算符(关系或数关系或数值表达式值表达式2)2)逻辑运算符对表达式进行逻辑运算。逻辑运算符对表达式进行逻辑运算。逻辑运算符和关系运算符的语法基本和逻辑运算符和关系运算符的语法基本和C C语言基本类似。语言基本类似。逻辑运算符列表逻辑运算符列表4.4.4.4.根据标志寄存器中的各种标志位符号根据标志寄存器中的各种标志位符号根据标志寄存器中的各种标志位符号根据标志寄存器中的各种标志位符号 11.1.2 11.1.2 分支伪操作分支伪操作 分支语句根据条件表达式的真假执行不同的代分支语句根据条件表达式的真假执行不同的代分支语句根据条件表达式的真假执行不同的代分支语句根据条件表达式的真假执行不同的代码模块,与码模块,与码模块,与码模块,与C C C C语言的语言的语言的语言的if/if/if/if/elseifelseifelseifelseif/else/else/else/else/endifendifendifendif相似。相似。相似。相似。语法如下:语法如下:语法如下:语法如下:.IFIFIFIF条件表达式条件表达式条件表达式条件表达式1 1 1 1 表达式表达式表达式表达式1 1 1 1为为为为“真真真真”时执行的指令时执行的指令时执行的指令时执行的指令.ELSEIFELSEIFELSEIFELSEIF条件表达式条件表达式条件表达式条件表达式2 2 2 2 表达式表达式表达式表达式2 2 2 2为为为为“真真真真”时执行的指令时执行的指令时执行的指令时执行的指令 .ELSEELSEELSEELSE 上述条件均不满足时执行的指令上述条件均不满足时执行的指令上述条件均不满足时执行的指令上述条件均不满足时执行的指令 .ENDIFENDIFENDIFENDIF11.1.3 11.1.3 循环伪操作循环伪操作 循环是重复执行的一组指令循环是重复执行的一组指令循环是重复执行的一组指令循环是重复执行的一组指令 ,分,分,分,分3 3 3 3种:种:种:种:1.WHILE-ENDW1.WHILE-ENDW1.WHILE-ENDW1.WHILE-ENDW循环循环循环循环.WHILEWHILEWHILEWHILE条件测试表达式条件测试表达式条件测试表达式条件测试表达式 循环体循环体循环体循环体.ENDWENDWENDWENDW2.REPEAT-UNTIL2.REPEAT-UNTIL2.REPEAT-UNTIL2.REPEAT-UNTIL循环:循环:循环:循环:.REPEATREPEATREPEATREPEAT 循环体循环体循环体循环体.UNTILUNTILUNTILUNTIL条件测试表达式条件测试表达式条件测试表达式条件测试表达式3.3.3.3.REPEAT-UNTILCXZREPEAT-UNTILCXZREPEAT-UNTILCXZREPEAT-UNTILCXZ循环循环循环循环 .REPEATREPEATREPEATREPEAT 循环体循环体循环体循环体.UNTILCXZUNTILCXZUNTILCXZUNTILCXZ 条件测试表达式条件测试表达式条件测试表达式条件测试表达式 使用使用.BREAKBREAK语句可以跳出循环。语句可以跳出循环。格式:格式:.BREAK.IF BREAK.IF 退出条件退出条件 使用使用.CONTINUECONTINUE语句可以跳到循环体的最后。语句可以跳到循环体的最后。计算计算0+1+2+8+90+1+2+8+9的几个例子的几个例子例例1 1:.WHILE/.ENDWWHILE/.ENDW循环形式循环形式XOR EAX,EAXXOR EAX,EAXXOR EBX,EBXXOR EBX,EBX.WHILE EBX 10.WHILE EBX=10EBX=10.ENDW.ENDW例例3 3:.REPEAT/.UNTILREPEAT/.UNTIL循环的形式循环的形式 XOR EAX,EAXXOR EAX,EAX XOR EBX,EBXXOR EBX,EBX.REPEAT.REPEAT ADD EAX,EBXADD EAX,EBX INC EBXINC EBX.UNTIL.UNTILEBX=10 EBX=10 例例4 4:.REPEAT/.UNTILCXZREPEAT/.UNTILCXZ循环形式循环形式 MOV ECX,10MOV ECX,10 XOR EAX,EAXXOR EAX,EAX XOR EBX,EBXXOR EBX,EBX.REPEAT.REPEAT ADD EAX,EBXADD EAX,EBX INC EBXINC EBX.UNTILCXZ.UNTILCXZ11.2 11.2 程序优化程序优化评价一个程序优劣评价一个程序优劣 的要素:的要素:实现思想是否合理清晰;实现思想是否合理清晰;书写风格是否符合规范;书写风格是否符合规范;程序的执行效率程序的执行效率(重要重要)程序在多长的时间内能够完成(时间)程序在多长的时间内能够完成(时间)程序需要多大的存储空间(空间)程序需要多大的存储空间(空间)11.2.1 11.2.1 运行时间的优化运行时间的优化 1 1选择执行速度快的指令选择执行速度快的指令 (1 1)寄存器清零)寄存器清零MOV EAX,0MOV EAX,0SUB EAX,EAXSUB EAX,EAXXOR EAX,EAXXOR EAX,EAX(2 2)加减。要使)加减。要使EBX=EAXEBX=EAX 30 30:LEA EBX,EAX-30LEA EBX,EAX-30LEA EBX,EAX-30LEA EBX,EAX-30(3 3)乘除。求)乘除。求EAX=EAX/16EAX=EAX/16:SHR EAX,4SHR EAX,4SHR EAX,4SHR EAX,4 求求EAX=EAX*8EAX=EAX*8:SHL EAX,3SHL EAX,3SHL EAX,3SHL EAX,32 2操作的转化操作的转化设被除数为设被除数为设被除数为设被除数为a a a a,除数为除数为除数为除数为b b b b,商为商为商为商为c c c c,余数为余数为余数为余数为d d d d,均为均为均为均为32323232位二进制数;位二进制数;位二进制数;位二进制数;ab=c ab=c ab=c ab=c余余余余d,d,d,d,即即即即a=a=a=a=bcbcbcbcd d d d;记记记记L=2L=2L=2L=232323232=100000000H=100000000H=100000000H=100000000H,求求求求出出出出M=M=M=M=(L L L L(b b b b 1 1 1 1)b b b b,则则则则c=c=c=c=aMaMaMaM/L/L/L/L设:设:设:设:Lb=e mod f,L=beLb=e mod f,L=beLb=e mod f,L=beLb=e mod f,L=bef f f f分两种情况:分两种情况:分两种情况:分两种情况:(1 1 1 1)f=0f=0f=0f=0,即即即即 L L L L能能能能 被被被被 b b b b整整整整 除除除除,M=M=M=M=(L L L L(bbbb1 1 1 1)b=L/b=e b=L/b=e b=L/b=e b=L/b=e;aMaMaMaM=a=a=a=a(L/bL/bL/bL/b)=(bcbcbcbc+d+d+d+d)L/bL/bL/bL/b)=cLcLcLcL+(dLdLdLdL/b/b/b/b)a a a a乘乘乘乘以以以以M M M M后后后后,结结结结果果果果是是是是64646464位位位位数数数数,高高高高32323232位位位位数数数数就就就就是是是是c c c c,即即即即EDXEDXEDXEDX。低低低低32323232位数为位数为位数为位数为dLdLdLdL/b /b /b /b。(2 2 2 2)0fb0fb0fb0f31313131)&(y-xy-xy-xy-x)求两个数中的较大的数利用公式求两个数中的较大的数利用公式max(x,y)=max(x,y)=max(x,y)=max(x,y)=x(x(x(x(xy)(xy)(xy)(xy)(WORbyteITSWORbyteITSWORbyteITSWORbyteITS1)1)1)1)&(x)&(x)&(x)&(xy)y)y)y)4 4算法的优化算法的优化举例:判断素数的算法举例:判断素数的算法一般思想:一般思想:guessguess为要判断的数,把从为要判断的数,把从2 2到到guess-1guess-1中中每一个数作为除数,去除每一个数作为除数,去除guessguess。如果商为如果商为0 0,则不是素数。,则不是素数。优化:优化:偶数不是素数,因此循环时可每次加偶数不是素数,因此循环时可每次加2 2,且不取偶数,没有必要从且不取偶数,没有必要从3 3到到guessguess取值取值 ,只需取到只需取到guessguess开方值开方值程序程序prime.prime.asmasm(P364)(P364)。5 5查表法查表法 要将十六进制数字要将十六进制数字要将十六进制数字要将十六进制数字015015015015转换为转换为转换为转换为09090909、AFAFAFAF。分析:分析:分析:分析:如果如果如果如果alalalal的初值为的初值为的初值为的初值为09090909,jbejbejbejbe指令会发生跳转,得到指令会发生跳转,得到指令会发生跳转,得到指令会发生跳转,得到09090909。如果如果如果如果alalalal的初值为的初值为的初值为的初值为1015101510151015,则,则,则,则JBEJBEJBEJBE指令不会跳转,得到指令不会跳转,得到指令不会跳转,得到指令不会跳转,得到AFAFAFAF。指令:指令:指令:指令:HexChars HexChars HexChars HexChars BYTE 0123456789ABCDEFBYTE 0123456789ABCDEFBYTE 0123456789ABCDEFBYTE 0123456789ABCDEF LEA EBX,LEA EBX,LEA EBX,LEA EBX,HexCharsHexCharsHexCharsHexChars XLATXLATXLATXLAT 11.2.2 11.2.2 占用空间的优化占用空间的优化 选用长度短的指令选用长度短的指令灵活利用堆栈灵活利用堆栈 使用联合使用联合压缩存储压缩存储1.1.选用长度短的指令选用长度短的指令 例如:在函数中,如果局部变量占例如:在函数中,如果局部变量占4 4字节,使字节,使用用下面的指令在堆栈中为局部变量分配空间:下面的指令在堆栈中为局部变量分配空间:SUB ESP,4SUB ESP,4下面的指令,其效果也是下面的指令,其效果也是ESPESP减去减去4 4,但占用程,但占用程序空间更少:序空间更少:PUSH ECXPUSH ECX2.2.灵活利用堆栈灵活利用堆栈将将将将EAXEAXEAXEAX中的数字输出可行的办法是:中的数字输出可行的办法是:中的数字输出可行的办法是:中的数字输出可行的办法是:求出每一个十进制数位,保存起来,最后再逐求出每一个十进制数位,保存起来,最后再逐求出每一个十进制数位,保存起来,最后再逐求出每一个十进制数位,保存起来,最后再逐个字符输出,直到商为个字符输出,直到商为个字符输出,直到商为个字符输出,直到商为0 0 0 0时为止。时为止。时为止。时为止。2004010120040101200401012004010110=2004010 10=2004010 10=2004010 10=2004010 余余余余 1 1 1 1 2004010 2004010 2004010 200401010=200401 10=200401 10=200401 10=200401 余余余余 0 0 0 0 200401 200401 200401 20040110=20040 10=20040 10=20040 10=20040 余余余余 1 1 1 1 20040 20040 20040 2004010=2004 10=2004 10=2004 10=2004 余余余余 0 0 0 0 2004 2004 2004 200410=200 10=200 10=200 10=200 余余余余 4 4 4 4 200 200 200 20010=20 10=20 10=20 10=20 余余余余 0 0 0 0 20 20 20 2010=2 10=2 10=2 10=2 余余余余 0 0 0 0 2 2 2 210=0 10=0 10=0 10=0 余余余余 2 2 2 2在除法的过程中,得到的余数可以保存在堆栈中在除法的过程中,得到的余数可以保存在堆栈中输出时再逐个弹出。输出时再逐个弹出。怎么才能知道有多少个有效的十进制数位呢?怎么才能知道有多少个有效的十进制数位呢?l l可以设置一个计数器,压入一个余数就进行计数,最后可以设置一个计数器,压入一个余数就进行计数,最后可以设置一个计数器,压入一个余数就进行计数,最后可以设置一个计数器,压入一个余数就进行计数,最后的计数值就是十进制位数的计数值就是十进制位数的计数值就是十进制位数的计数值就是十进制位数 ;l l首先压入一个数字首先压入一个数字首先压入一个数字首先压入一个数字10101010,在弹出数字时,进行比较。如果,在弹出数字时,进行比较。如果,在弹出数字时,进行比较。如果,在弹出数字时,进行比较。如果小于小于小于小于10101010,就是一个有效的十进制数位;如果等于,就是一个有效的十进制数位;如果等于,就是一个有效的十进制数位;如果等于,就是一个有效的十进制数位;如果等于10101010,就,就,就,就表示已经处理结束。表示已经处理结束。表示已经处理结束。表示已经处理结束。3.3.使用联合使用联合fileBuffer fileBuffer BYTE 4096 DUP(?)BYTE 4096 DUP(?)outputBuffer outputBuffer BYTE 2000 DUP(?)BYTE 2000 DUP(?)4.4.压缩存储压缩存储年、月、日组成一个日期,声明为一个结构:年、月、日组成一个日期,声明为一个结构:年、月、日组成一个日期,声明为一个结构:年、月、日组成一个日期,声明为一个结构:oneday oneday oneday oneday STRUC STRUC STRUC STRUC year DW 0 ;year DW 0 ;year DW 0 ;year DW 0 ;年年年年 month BYTE 0 ;month BYTE 0 ;month BYTE 0 ;month BYTE 0 ;月月月月 day BYTE 0 ;day BYTE 0 ;day BYTE 0 ;day BYTE 0 ;日日日日oneday oneday oneday oneday ENDSENDSENDSENDS11.3 11.3 文件操作文件操作在在C C编程中,可以调用各种库函数来完成编程中,可以调用各种库函数来完成文件处理文件。在文件处理文件。在WindowsWindows汇编编程中,同样汇编编程中,同样也可以调用这些库函数。也可以调用这些库函数。1 1系统定义的系统定义的3 3个文件个文件l lstdinstdin标准输入文件,即终端输入,一般为标准输入文件,即终端输入,一般为键盘;键盘;l lstdoutstdout标准输出文件,即终端输出,一般为标准输出文件,即终端输出,一般为显示器;显示器;l lstderrstderr标准错误文件,一般为显示器;标准错误文件,一般为显示器;11.3.1 11.3.1 文件操作的基本函数文件操作的基本函数2 2文件的打开模式文件的打开模式3 3文件指针文件指针 文件指针是一个长整数,表示当前读写位置文件指针是一个长整数,表示当前读写位置在整个文件中的偏移。在整个文件中的偏移。设置文件指针的函数:设置文件指针的函数:int fseekint fseek(FILE*(FILE*fpfp,long pos,long pos,int int where);where);l lwherewhere指出本次操作的参照点指出本次操作的参照点 l lpospos表示位移量表示位移量 11.3.2 11.3.2 文件处理实例文件处理实例例例1 1在文本文件中查找字符串在文本文件中查找字符串(P374)P374)。grepstrgrepstr.c.cgrepstrgrepstr.asmasm例例2.2.对文件内容加密对文件内容加密/解密解密(P378)P378)。crypt.crypt.asm asm 11.4 11.4 结构化异常处理结构化异常处理 SEHSEH(Structured Exception HandlingStructured Exception Handling),),即结构化异常处理即结构化异常处理,是,是WindowsWindows操作系统提供操作系统提供处理程序错误或异常的机制。处理程序错误或异常的机制。11.4.1 11.4.1 捕捉程序中的异常捕捉程序中的异常 在同一个函数中,在同一个函数中,_ _trytry、_except _except 是是可以嵌套的;而且主程序和子程序中都可以可以嵌套的;而且主程序和子程序中都可以用这种方式设置异常处理,形成层次化的异用这种方式设置异常处理,形成层次化的异常处理。常处理。SEHSEH可以为程序中不同部分的代码分可以为程序中不同部分的代码分别设置异常处理程序。别设置异常处理程序。11.4.2 11.4.2 汇编程序中的异常处理汇编程序中的异常处理 例编写汇编程序,捕获并处理一个异常。例编写汇编程序,捕获并处理一个异常。实例见教材实例见教材P384P384。