匯編語言高級編程技術(shù).ppt_第1頁
匯編語言高級編程技術(shù).ppt_第2頁
匯編語言高級編程技術(shù).ppt_第3頁
匯編語言高級編程技術(shù).ppt_第4頁
匯編語言高級編程技術(shù).ppt_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第8章 匯編語言高級編程技術(shù),8.1 宏 8.2 匯編高級語法 8.3 模塊化程序設(shè)計 8.4 C和匯編的混合編程 8.5 程序優(yōu)化,8.1 宏,8.1.1 宏指令的定義和使用 宏指令的使用有3個步驟: 宏定義 宏調(diào)用 宏擴(kuò)展,宏定義,格式: 宏指令名 MACRO 形式參數(shù)表 ;宏指令體 ENDM 形式參數(shù)表給出形參,形參之間用逗號隔開。,宏調(diào)用和宏擴(kuò)展,宏調(diào)用的格式 : 宏指令名 實參數(shù)表 實參應(yīng)和形參順序一致 宏擴(kuò)展 : 用宏指令體的語句序列替換宏指令名 并用實參替換形參,2LOCAL偽操作,程序中多次調(diào)用宏指令,展開時其中的標(biāo) 號重復(fù),導(dǎo)致編譯出錯。 解決辦法 :將宏定義體中的標(biāo)號說明為

2、局 部標(biāo)號 格式:local 標(biāo)號1,標(biāo)號2, 標(biāo)號3, ,3PURGE偽指令,PURGE偽指令取消已定義的宏指令 格式為: PURGE 宏指令名 , 宏指令名, 注意: 宏指令被取消的程序就不能再使用這個宏指令 指令取消之前的宏調(diào)用已經(jīng)被展開,不受影響,8.1.2 宏指令中參數(shù)的使用,1MOVE宏指令 MOV指令不允許源操作數(shù)和目標(biāo)操作數(shù)同時為內(nèi)存操作數(shù),我們?nèi)绱硕x: dwVarA DWORD ? dwVarB DWORD 50 MOVE MACROX, Y PUSH Y POP X ENDM 調(diào)用MOVE dwVarA,dwVarB,可將后者內(nèi)容賦給前者,2SUBX宏指令,SUB指令執(zhí)行

3、后,目標(biāo)操作數(shù)中的被減數(shù)被“差” 替換掉。我們可以定義一個新的宏指令,它包括 3個參數(shù):被減數(shù)(minuend)、減數(shù) (subtrahend)、差(difference)。 SUBX MACRO minuend, subtrahend, difference PUSH EAX MOV EAX, minuend SUB EAX, subtrahend MOV difference, EAX,SUBX宏指令(續(xù)),;接上頁程序 POP EAX ENDM 要計算ECX=EDX8,就調(diào)用SUBX宏: SUBX EDX, 8, ECX,3Idx宏指令,對給定的數(shù)組下標(biāo)i, j,元素的地址為: 數(shù)組首地

4、址 + (i * RowSize + j) * ElementSize RowSize表示為數(shù)組每行的大小 ElementSize表示為每個元素的大小 橫線部分可以用宏指令表示: Idx MACRO I, J, RowSize IMUL EBX,I, RowSize ADD EBX, J,Idx宏指令(續(xù)),;接上頁程序 ADD EBX, EBX SHL EBX, 2 ENDM 調(diào)用上述Idx宏指令就可求得數(shù)組元素的位置,8.1.3 特殊的宏操作符,1操作符 重復(fù)塊 ENDM REPT也可以寫做repeat。 數(shù)值表達(dá)式?jīng)Q定重復(fù)次數(shù) 重復(fù)塊中可以是任何有效的匯編語句,重復(fù)塊中是指令序列 的例子

5、: 打印數(shù)字9、99、999、9999的平方數(shù) FmtSqureStrBYTE%d * %d = %d, 0ah, 0 X=9 REPT4 INVOKE printf, offset fmtSqureStr, X, X, X*X X =X*10+9 ENDM,2不定重復(fù)偽指令I(lǐng)RP,IRP指令由參數(shù)來決定重復(fù)次數(shù),格式為: IRP MACRO 形參,實參表 ; 重復(fù)塊 ENDM IRP也可以寫做for 形參只能有一個,實參表中可以有多個參數(shù) 實參表中參數(shù)個數(shù)就是重復(fù)次數(shù),按順序取代形參,下面IRP的實參表中包含3個參數(shù) IRP VALUE, BYTE VALUE, 0 ENDM 其結(jié)果相當(dāng)于:

6、 BYTE USB, 0 BYTE FLOPPY, 0 BYTE CD-ROM, 0,3不定重復(fù)偽指令I(lǐng)RPC,參數(shù)表用一個字符串來表示 ,格式為 IRPCMACRO 形參,字符串 ; 重復(fù)塊 ENDM IRPC也可以寫做FORC 形參只有一個,字符串可以包括字母、數(shù)字等, 字符個數(shù)就是重復(fù)次數(shù) ; 字符串中的字符按順序替代形參,例如,使用字符串123,每次用一個字符來代替Z。 IRPC Z, 123 BYTE Z ENDM 展開后的結(jié)果為: BYTE 1 BYTE 2 BYTE 3,8.1.6 條件匯編,條件匯編偽指令的格式如下: IFXXYY ; 語句塊1 ELSE ; 語句塊2 ENDI

7、F ELSE可以不寫,對于IFXX YY 條件為真時,將語句塊1包含在程序中; 條件為假時,將語句塊2包含在程序中。,條件匯編偽指令,條件匯編偽指令大體上分為: 1IF和IFE偽指令 2. IFB和IFNB偽指令 用在宏定義體中,用來確定形參是否為空 3IFDEF和IFNDEF偽指令 用一個符號DEBUG來控制是否包括打印語句 4IFIDNI偽指令 舉例:IFIDNI,8.2 匯編高級語法,匯編語言語法問題: 分支和循環(huán)程序結(jié)構(gòu)存在標(biāo)號定義和程序流程復(fù)雜的問題 可讀性、簡潔性、可維護(hù)性不如高級語言 編寫匯編程序時比較煩瑣 MASM引入了一系列偽指令來實現(xiàn)條件測試、分支和循環(huán)語句等。,8.2.1

8、 條件測試表達(dá)式,條件測試表達(dá)式的形式 : 1.寄存器或內(nèi)存變量 例如:x ;x不等0時為真 EAX ;EAX不等于0時為真 2. 利用關(guān)系運算符 (數(shù)值表達(dá)式1)關(guān)系運算符(數(shù)值表達(dá)式2) 關(guān)系運算符比較數(shù)值表達(dá)式1和數(shù)值表達(dá)式2的內(nèi)容,關(guān)系運算符列表,條件測試表達(dá)式,3. 利用邏輯運算符 (關(guān)系或數(shù)值表達(dá)式1) 邏輯運算符 (關(guān)系或數(shù)值表達(dá)式2) 邏輯運算符對表達(dá)式進(jìn)行邏輯運算。 邏輯運算符和關(guān)系運算符的語法基本和C語言基本類似。,邏輯運算符列表,條件測試表達(dá)式,4. 根據(jù)標(biāo)志寄存器中的各種標(biāo)志位符號,8.2.2 分支偽操作,分支語句根據(jù)條件表達(dá)式的真假執(zhí)行不同的代碼模塊,與C語言的if/

9、elseif/else/endif相似。語法如下 .IF條件表達(dá)式1 表達(dá)式1為“真”時執(zhí)行的指令 .ELSEIF條件表達(dá)式2 表達(dá)式2為“真”時執(zhí)行的指令 .ELSE 上述條件均不滿足時執(zhí)行的指令 .ENDIF,8.2.3 循環(huán)偽操作,循環(huán)是重復(fù)執(zhí)行的一組指令 ,分3種: 1 WHILE-ENDW循環(huán): .WHILE條件測試表達(dá)式 循環(huán)體 .ENDW 首先判斷條件測試表達(dá)式 如果結(jié)果是“真”,則執(zhí)行循環(huán)體內(nèi)的指令,結(jié)束后再判斷表達(dá)式,直到表達(dá)式結(jié)果為“假”為止。 如果第一次判斷結(jié)果就為“假”,則直接退出循環(huán),循環(huán)偽操作,2 REPEAT-UNTIL循環(huán): .REPEAT 循環(huán)體 .UNTIL

10、條件測試表達(dá)式 先執(zhí)行一次循環(huán)體內(nèi)的指令,然后判斷條件測試表達(dá)式: 如果結(jié)果是“假”,則繼續(xù)執(zhí)行循環(huán)體內(nèi)的指令,一直到表達(dá)式結(jié)果為“真”為止 循環(huán)體至少會執(zhí)行一次,循環(huán)偽操作,3 REPEAT-UNTILCXZ循環(huán) .REPEAT 循環(huán)體 .UNTILCXZ條件測試表達(dá)式 如果.UNTILCXZ后面沒有條件測試表達(dá)式,則循環(huán)的次數(shù)由ECX指定; 如果.UNTILCXZ后面帶有條件測試表達(dá)式,循環(huán)的次數(shù)由ECX和表達(dá)式共同控制。 當(dāng)ECX不等于0且表達(dá)式的值為“假”時,ECX減1,繼續(xù)循環(huán) 當(dāng)ECX等于0或者表達(dá)式的值為“真”時,終止循環(huán)。,循環(huán)偽操作,使用.BREAK語句可以跳出循環(huán); .BR

11、EAK后面可以加.IF ,滿足條件才跳出循環(huán)。 格式:.BREAK .IF 退出條件 使用.CONTINUE語句可以跳到循環(huán)體的最后。,計算0+1+2+8+9的幾個例子,例1: .WHILE/.ENDW循環(huán)形式 XOR EAX, EAX XOR EBX, EBX .WHILE EBX 10 ADD EAX, EBX INC EBX .ENDW,計算0+1+2+8+9的幾個例子,例2:用.BREAK語句來終止循環(huán) XOR EAX, EAX XOR EBX, EBX .WHILE1 ADD EAX, EBX INC EBX .BREAK .IFEBX = 10 .ENDW,計算0+1+2+8+9的

12、幾個例子,例3:.REPEAT/.UNTIL循環(huán)的形式 XOR EAX, EAX XOR EBX, EBX .REPEAT ADD EAX, EBX INC EBX .UNTILEBX = 10,計算0+1+2+8+9的幾個例子,例4:.REPEAT/.UNTILCXZ循環(huán)形式 MOV ECX, 10 XOR EAX, EAX XOR EBX, EBX .REPEAT ADD EAX, EBX INC EBX .UNTILCXZ,8.3 模塊化程序設(shè)計,8.3.1 模塊化程序設(shè)計基本概念 可以將一個大的系統(tǒng)分解為小的模塊,各個模塊可并行完成,最后組合成為一個完整的系統(tǒng)。,8.3.2 模塊間的通

13、信,1外部引用偽指令EXTRN 格式:EXTRN 變量名:類型,. 功能:說明在本模塊中用到的變量是在另一個模塊中定義的,同時指出變量的類型 。 說明:EXTRN偽指令應(yīng)出現(xiàn)在程序引用該名字之前,一般放在程序開頭。,模塊間的通信,2全局符號說明偽指令PUBLIC 格式:PUBLIC 名字,. 功能:本模塊中定義的名字可以被其他模塊使用。 說明:名字可以是變量名,也可以是子程序名。,模塊間的通信,3子程序聲明偽指令PROTO 格式:子程序名 PROTO C | stdcall :第一個參數(shù)類型 ,:后續(xù)參數(shù)類型 功能:說明子程序名字和參數(shù)類型,供主程序調(diào)用。 程序示例:mod1.asm mod2

14、.asm 結(jié)果:100 - 60 = 40,8.4 C和匯編的混合編程,關(guān)鍵:兩種語言的接口問題 解決方法: 在C程序中直接嵌入?yún)R編代碼 由C語言主程序調(diào)用匯編子程序,8.4.1 直接嵌入,C語言程序中直接嵌入?yún)R編語句 格式為:_asm 匯編語句 對于連續(xù)的多個匯編語句,格式為: asm 匯編語句 匯編語句 ,內(nèi)嵌匯編語句的操作碼必須是有效的80 x86指令。 不能使用byte,word,dword等語句定義數(shù)據(jù)。 內(nèi)嵌匯編語句中的操作數(shù)可以是: 寄存器; 局部變量、全局變量和函數(shù)參數(shù); 結(jié)構(gòu)成員。 程序清單:inline.c (嵌入?yún)R編),8.4.2 C程序調(diào)用匯編子程序,C源程序中所有語句

15、要符合C的語法規(guī)則; 匯編源程序的所有語句要符合匯編的語法規(guī)則; C模塊可調(diào)用匯編模塊中的子程序,還可以使用匯編模塊中定義的全局變量; 匯編模塊可調(diào)用C模塊中的函數(shù),可以使用C模塊中定義的全局變量。,1C模塊使用匯編模塊中的變量,C和匯編有些變量類型是等價的,可以相互轉(zhuǎn)換,C模塊使用匯編模塊中的變量,C源程序要使用匯編模塊中的變量,則在匯編模 塊中的變量名必須以下劃線開頭。 例如: _strFormula sbyte Pythagorean theorem: x*x+y*y=z*z,0 _xval sdword 3 _yval sdword 4 _zval sdword 5 C模塊中使用這些變

16、量時,前面的下劃線必須去掉,2匯編模塊使用C模塊中的變量,C模塊中,應(yīng)采用extern來指明變量可以由外部 模塊所使用, 例如:extern int x, y, z; 在匯編模塊中,要使用這個變量,應(yīng)該用EXTRN 加以說明, 例如:EXTRN _x:sdword, _y:sdword, _z:sdword 使用變量如:MOV EAX, _x,3C模塊調(diào)用匯編模塊中的子程序,關(guān)鍵功能用匯編語言來編寫,再由C語言來調(diào)用 程序舉例: C/匯編聯(lián)合編程的主模塊 united.c C/匯編聯(lián)合編程的子模塊 unite.asm,4編譯鏈接過程,對C模塊和匯編模塊分別進(jìn)行編譯,生成各自的.obj文件。 將

17、這些.obj文件鏈接成一個可執(zhí)行文件 如圖:,5C調(diào)用規(guī)則,上例的Verify1,Verify2,Verify3,Verify4都采用了C調(diào)用規(guī)則 , 主程序按照從右至左的順序,將參數(shù)順序壓入堆棧; 子程序返回后,主程序通過“ADD ESP, n”指令調(diào)整ESP的值 。 如果在說明子程序時不加調(diào)用規(guī)則,則應(yīng)在子程序名前加下劃線,參數(shù)也應(yīng)自行定義。,6stdcall調(diào)用規(guī)則,定義子程序時使用stdcall規(guī)則,不用C規(guī)則 舉例: Verify2 PROC stdcall x:dword, y:dword, z:dword 在C模塊中,在說明Verify2時要加上_stdcall: extern

18、int _stdcall Verify2(int x, int y, int z); int ret = Verify2(x, y, z);,7生成map文件,鏈接過程生成map文件 可以查看共享的變量、函數(shù)在目標(biāo)文件中的真實名字 例如: link united.obj unite.obj /out:united.exe /map:united.map /subsystem:console,8.4.3 匯編調(diào)用C函數(shù),使用PROTO說明C函數(shù)的名稱、調(diào)用方式、參數(shù)類型等,如: input PROTO C px:ptr sdword, py:ptr sdword, pz:ptr sdword v

19、erify PROTO C x:dword, y:dword, z:dword 舉例: C/匯編聯(lián)合編程中的子模塊 mix.c C/匯編聯(lián)合編程的主模塊 mixed.asm,8.4.4 C+與匯編,1使用C方式共享變量和函數(shù) 在C+一方,要將與匯編模塊共享的變量、函數(shù)等用extern “C”的形式說明。 舉例: C+/匯編聯(lián)合編程 ArrSum.cpp C+/匯編聯(lián)合編程 ArraySum.asm,8.4.4 C+與匯編,2C+類的實例與方法 程序demo.cpp中,有兩個類A,B。 A是B的基類,類A和類B各有自己的reset ( ) 方法和output ( ) 方法。程序的輸出結(jié)果為: A

20、: 1 B: 2, 3 A: 10 B: 10, 0,類A的實例a,類B的實例b所占用的內(nèi)存單元的內(nèi)容如圖 類的vtable就像一張表格,存放它的虛函數(shù)的地址,8.5 程序優(yōu)化,評價一個程序優(yōu)劣 的要素: 實現(xiàn)思想是否合理清晰; 書寫風(fēng)格是否符合規(guī)范; 程序的執(zhí)行效率(重要) 程序在多長的時間內(nèi)能夠完成(時間) 程序需要多大的存儲空間(空間),8.5.1 運行時間的優(yōu)化,1選擇執(zhí)行速度快的指令 (1)寄存器清零 將寄存器清零,有以下幾種指令: MOV EAX, 0 SUB EAX, EAX XOR EAX, EAX 其中SUB,XOR指令執(zhí)行速度比MOV指令快,而且所需程序空間少,所以應(yīng)選這2種指令之一(XOR更常用)。,選擇執(zhí)行速

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論