《Ch11 深入Windows匯編編程》由會員分享,可在線閱讀,更多相關(guān)《Ch11 深入Windows匯編編程(37頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,第十一章 深入,Windows,匯編編程,11.1 匯編高級語法,11.2 程序優(yōu)化,11.3 文件操作,11.4 結(jié)構(gòu)化異常處理,11.1 匯編高級語法,匯編語言語法問題,:,分支和循環(huán)程序結(jié)構(gòu)存在標(biāo)號定義和程序流程復(fù)雜的問題,可讀性、簡潔性、可維護性不如高級語言編寫匯編程序時比較煩瑣,MASM,引入了一系列偽指令來實現(xiàn)條件測試、分支和循環(huán)語句等。,11.1.1 條件測試表達式,條件測試表達式的形式:,1.寄存器或內(nèi)存變量,例如
2、:,x ;x,不等0時為真,EAX ;EAX,不等于0時為真,2.利用關(guān)系運算符,(,數(shù)值表達式,1),關(guān)系運算符,(,數(shù)值表達式,2),關(guān)系運算符比較數(shù)值表達式1和數(shù)值表達式2的內(nèi)容,關(guān)系運算符列表,3.利用邏輯運算符,(,關(guān)系或數(shù)值表達式,1),邏輯運算符,(,關(guān)系或數(shù)值表達式,2),邏輯運算符對表達式進行邏輯運算。,邏輯運算符和關(guān)系運算符的語法基本和,C,語言基本類似。,邏輯運算符列表,4.根據(jù)標(biāo)志寄存器中的各種標(biāo)志位符號,11.1.2 分支偽操作,分支語句根據(jù)條件表達式的真假執(zhí)行不同的代碼模塊,與,C,語言的,if/,elseif,/else/,endif,相似。語法如下:,.,IF,
3、條件表達式,1,表達式,1,為,“,真,”,時執(zhí)行的指令,.,ELSEIF,條件表達式,2,表達式,2,為,“,真,”,時執(zhí)行的指令,.,ELSE,上述條件均不滿足時執(zhí)行的指令,.,ENDIF,11.1.3 循環(huán)偽操作,循環(huán)是重復(fù)執(zhí)行的一組指令,分3種:,1.WHILE-ENDW,循環(huán),.,WHILE,條件測試表達式,循環(huán)體,.,ENDW,2.REPEAT-UNTIL,循環(huán):,.,REPEAT,循環(huán)體,.,UNTIL,條件測試表達式,3.,REPEAT-UNTILCXZ,循環(huán),.,REPEAT,循環(huán)體,.,UNTILCXZ,條件測試表達式,使用.,BREAK,語句可以跳出循環(huán)。,格式:,.,B
4、REAK.IF,退出條件,使用.,CONTINUE,語句可以跳到循環(huán)體的最后。,計算0+1+2+8+9的幾個例子,例1:.,WHILE/.ENDW,循環(huán)形式,XOR EAX,EAX,XOR EBX,EBX,.WHILE EBX=10,.ENDW,例3:.,REPEAT/.UNTIL,循環(huán)的形式,XOR EAX,EAX,XOR EBX,EBX,.REPEAT,ADD EAX,EBX,INC EBX,.UNTILEBX=10,例4:.,REPEAT/.UNTILCXZ,循環(huán)形式,MOV ECX,10,XOR EAX,EAX,XOR EBX,EBX,.REPEAT,ADD EAX,EBX,INC E
5、BX,.UNTILCXZ,11.2 程序優(yōu)化,評價一個程序優(yōu)劣 的要素:,實現(xiàn)思想是否合理清晰;,書寫風(fēng)格是否符合規(guī)范;,程序的執(zhí)行效率(重要,),程序在多長的時間內(nèi)能夠完成(時間),程序需要多大的存儲空間(空間),11.2.1 運行時間的優(yōu)化,1選擇執(zhí)行速度快的指令,(1)寄存器清零,MOV EAX,0,SUB EAX,EAX,XOR EAX,EAX,(2)加減。要使,EBX=EAX,30:,LEA EBX,EAX-30,(3)乘除。求,EAX=EAX/16:,SHR EAX,4,求,EAX=EAX*8:,SHL EAX,3,2操作的轉(zhuǎn)化,設(shè)被除數(shù)為,a,,除數(shù)為,b,,商為,c,,余數(shù)為,
6、d,,均為32位二進制數(shù);,ab=c,余,d,即,a=,bc,d;,記,L=2,32,=100000000H,,求出,M=(L(b,1),b,,,則,c=,aM,/L,設(shè):,Lb=e mod f,L=bef,分兩種情況:,(1)f=0,,即,L,能被,b,整除,,M=(L(b1)b=L/b=e;,aM,=a(L/b)=(,bc,+d)L/b)=,cL,+(,dL,/b),a,乘以,M,后,結(jié)果是64位數(shù),高32位數(shù)就是,c,,即,EDX。,低32位數(shù)為,dL,/b。,(2)0f31)&(y-x),求兩個數(shù)中的較大的數(shù)利用公式,max(x,y)=x(xy)(,WORbyteITS,1)&(xy)
7、,4算法的優(yōu)化,舉例:判斷素數(shù)的算法,一般思想:,guess,為要判斷的數(shù),把從2到,guess-1,中每一個數(shù)作為除數(shù),去除,guess。,如果商為0,則不是素數(shù)。,優(yōu)化:,偶數(shù)不是素數(shù),因此循環(huán)時可每次加2,且不取偶數(shù),沒有必要從3到,guess,取值,只需取到,guess,開方值,程序,prime.,asm,(P364),。,5查表法,要將十六進制數(shù)字015轉(zhuǎn)換為09、,AF。,分析:,如果,al,的初值為09,,jbe,指令會發(fā)生跳轉(zhuǎn),得到,09。,如果,al,的初值為1015,則,JBE,指令不會跳轉(zhuǎn),得到,AF。,指令:,HexChars,BYTE 0123456789ABCDEF
8、,LEA EBX,HexChars,XLAT,11.2.2 占用空間的優(yōu)化,選用長度短的指令,靈活利用堆棧,使用聯(lián)合,壓縮存儲,1.選用長度短的指令,例如:在函數(shù)中,如果局部變量占4字節(jié),使用,下面的指令在堆棧中為局部變量分配空間:,SUB ESP,4,下面的指令,其效果也是,ESP,減去4,但占用程,序空間更少:,PUSH ECX,2.靈活利用堆棧,將,EAX,中的數(shù)字輸出可行的辦法是:,求出每一個十進制數(shù)位,保存起來,最后再逐個字符輸出,直到商為0時為止。,20040101,10=2004010,余,1,2004010,10=200401,余,0,200401,10=20040,余,1,2
9、0040,10=2004,余,0,2004,10=200,余,4,200,10=20,余,0,20,10=2,余,0,2,10=0,余,2,在除法的過程中,得到的余數(shù)可以保存在堆棧中,輸出時再逐個彈出。,怎么才能知道有多少個有效的十進制數(shù)位呢?,可以設(shè)置一個計數(shù)器,壓入一個余數(shù)就進行計數(shù),最后的計數(shù)值就是十進制位數(shù);,首先壓入一個數(shù)字10,在彈出數(shù)字時,進行比較。如果小于10,就是一個有效的十進制數(shù)位;如果等于10,就表示已經(jīng)處理結(jié)束。,3.使用聯(lián)合,fileBuffer,BYTE 4096 DUP(?),outputBuffer,BYTE 2000 DUP(?),4.壓縮存儲,年、月、日組成
10、一個日期,聲明為一個結(jié)構(gòu):,oneday,STRUC year DW 0 ;,年,month BYTE 0 ;,月,day BYTE 0 ;,日,oneday,ENDS,11.3 文件操作,在,C,編程中,可以調(diào)用各種庫函數(shù)來完成文件處理文件。在,Windows,匯編編程中,同樣也可以調(diào)用這些庫函數(shù)。,1系統(tǒng)定義的3個文件,stdin,標(biāo)準(zhǔn)輸入文件,即終端輸入,一般為鍵盤;,stdout,標(biāo)準(zhǔn)輸出文件,即終端輸出,一般為顯示器;,stderr,標(biāo)準(zhǔn)錯誤文件,一般為顯示器;,11.3.1 文件操作的基本函數(shù),2文件的打開模式,3文件指針,文件指針是一個長整數(shù),表示當(dāng)前讀寫位置,在整個文件中的偏移
11、。,設(shè)置文件指針的函數(shù):,int fseek,(FILE*,fp,long pos,int,where);,where,指出本次操作的參照點,pos,表示位移量,11.3.2 文件處理實例,例1在文本文件中查找字符串(,P374)。,grepstr,.c,grepstr,.,asm,例2.對文件內(nèi)容加密/解密(,P378)。,crypt.,asm,11.4,結(jié)構(gòu)化異常處理,SEH(Structured Exception Handling),,即結(jié)構(gòu)化異常處理,,是,Windows,操作系統(tǒng)提供處理程序錯誤或異常的機制。,11.4.1,捕捉程序中的異常,在同一個函數(shù)中,_,try、_except,是可以嵌套的;而且主程序和子程序中都可以用這種方式設(shè)置異常處理,形成層次化的異常處理。,SEH,可以為程序中不同部分的代碼分別設(shè)置異常處理程序。,11.4.2,匯編程序中的異常處理,例編寫匯編程序,捕獲并處理一個異常。,實例見教材,P384。,