版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第七章 高級匯編語言技術,子程序結構有很多優(yōu)點 提供模塊化程序設計的條件,便于程序調試及維護等。編程效率高,可以節(jié)省存儲空間及程序設計所花的時間。 但使用子程序也有一些不足: 增加了一些額外開銷,包括轉子及返回、保存及恢復寄存器現(xiàn)場以及參數(shù)的傳送等。,§7.1 宏匯編§7.2 重復匯編§7.3 條件匯編,宏(Macro)是匯編語言的一個特點,它是與子程序類似又獨具特色的另一
2、種簡化源程序的方法,——統(tǒng)稱宏結構,,§7.1 宏匯編,宏定義源程序中一段有獨立功能的程序代碼組成宏。它只需定義一次,就可以用一條宏指令多次調用它?! 『甓x用一組偽操作來實現(xiàn)?! 「袷剑骸 『甓x名 MACRO [ 啞元表 ] . .(宏定義體) . ENDM,§7.1 宏匯編,例7.1 用宏指令定義兩個字操作數(shù)相乘,得到一個16
3、位的第三個操作數(shù)作為結果。宏定義: MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX MOV AX, OPR1
4、 IMUL OPR2 MOV RESULT, AX POP AX
5、 POP DX ENDM,§7.1 宏匯編,宏調用 . . . MULTIPLY CX, VAR, XYZ[BX] ;第一次宏調用 . . MULTIPLY 240, BX
6、, SAVE ?。坏诙魏暾{用 . .,§7.1 宏匯編,PUSH DX1 PUSH AX MOV AX,CX ;第一個操作數(shù)在CX中1 IMUL VAR ;第二個操作數(shù)是變量VAR MOV XYZ[BX], AX ??;結果存入實參XYZ[BX]1 POP
7、AX1 POP DX,2PUSH DXPUSH AX2MOV AX,240 ;第一個操作數(shù)是立即數(shù)240IMUL BX ??;第二個操作數(shù)在BX中2MOV SAVE, AX ;結果存入變量SAVE2POP AX2POP DX,§7.1 宏匯編,一般說來,實元的個數(shù)和啞元的個數(shù)相等
8、,但匯編程序并不要求它們必須相等。若實元個數(shù)大于啞元個數(shù),則多余的實元不予考慮;若實元個數(shù)小于啞元個數(shù),則多余的啞元作"空"處理?! ×硗庑枰⒁獾氖?,宏展開后,即用實元取代啞元后,所得到的語句應該是有效的,即匯編語法應是正確的,否則匯編程序將會指示出錯。,§7.1 宏匯編,TESTMACROVAR1,VAR2mov ah,var1mov bh,var2cmp ah,bh
9、jne exitmov ah,01hexit:mov ah,02hENDM,§7.1 宏匯編,,,,僅是源程序級的簡化:宏調用在匯編時進行程序語句的展開,不需要返回;不減小目標程序,執(zhí)行速度沒有改變通過形參、實參結合實現(xiàn)參數(shù)傳遞,簡捷直觀、靈活多變,還是目標程序級的簡化:子程序調用在執(zhí)行時由CALL指令轉向、RET指令返回;形成的目標代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲單元或堆棧等傳遞參數(shù),
10、,,宏與子程序具有各自的特點,程序員應該根據(jù)具體問題選擇使用那種方法通常,當程序段較短或要求較快執(zhí)行時,應選用宏;當程序段較長或為減小目標代碼時,要選用子程序,§7.1 宏匯編,宏定義中的參數(shù)宏定義可以無變元 SAVEREG MACRO ??;啞元表為空 PUSH AX PUSH BX PUSH
11、 CX PUSH DX PUSH SI PUSH DI ENDM 宏調用: SAVEREG,§7.1 宏匯編,宏定義中的參數(shù)變元可以是操作碼 TEST MACRO P1,P2,P3 MOV AX,P1 P2 P3 ;
12、變元P2為操作碼ENDM 宏調用:TEST WORD_VAR,INC,AX 宏展開:1 MOV AX,WORD_VAR1 INC AX ;用實元INC取代啞元 P2,形成INC指令,§7.1 宏匯編,宏定義中的參數(shù)LP MACRO
13、 COND,LAB J&COND LAB ?。籎與啞元COND由&相連,形成該指令 操作碼ENDM 宏調用: LP Z,THERE LP NZ,HERE 宏展開:
14、 1 JZ THERE ;J與實元Z形成JZ條件指令 1 JNZ HERE ??;J與實元NZ形成JNZ條件指令,§7.1 宏匯編,例7.5 宏定義: FO MACRO P1 JMP TA&P1 ;TA與啞元P1形成無條件跳轉
15、 指令中的標號 ENDM 宏調用: FO WORD_VAR 宏展開: 1 JMP TAWORD_VAR ;TA與實元
16、 WORD_VAR形成標號 TAWORD_VAR 在這里,如果宏定義寫為 FO MACRO P1 JMP TAP1 ENDM 則在展開時,匯編程
17、序把TAP1看作是一個獨立的標號,并不把TAP1中的P1作為啞元看待,這樣就不能得到預期的結果。,§7.1 宏匯編,ABSOL MACRO OPER CMP OPER,0 JGE NEXT NEG OPER NEXT: ADD AX,OPERENDM ABSOL BX
18、 ABSOL CX,§7.1 宏匯編,LOCAL偽操作ABSOL MACRO OPER ??;求某操作數(shù)的絕對值 LOCAL NEXT CMP OPER,0 JGE NEXT NEG OPER ??;如果是負數(shù),則求補 NEXT: ADD AX,OPERENDMABSOL BXABSOL CX,§7.1 宏匯編,在宏
19、定義內使用宏 DIF MACRO X,Y ?。磺蠖?數(shù)之差 MOV AX,X SUB AX,Y ENDMDIFSQR MACRO OPR1,OPR2,RESULT ;求二數(shù)之差的平方 PUSH DX PUSH AX DIF
20、 OPR1,OPR2 IMUL AX MOV RESULT,AX POP AX POP DXENDM 宏調用: DIFSQR VAR1,VAR2,VAR3,宏展開:1 PUSH DX1 PUSH AX2 MOV AX,VAR12 SUB AX,VAR21 IMUL AX1 MOV VAR3,AX
21、1 POP AX1 POP DX,§7.1 宏匯編,宏庫的建立與調用 有時,程序里定義了較多宏,或者可以把自己編程中常用的宏定義建立成一個獨立的文件,這個只包含若干宏定義的文件稱為宏庫,通常用擴展名MAC或INC來表示。當應用程序中需要用到宏庫中的某些宏定義時,只需要在該程序的開始用INCLUDE語句說明如下: INCLUDE C: \ MACRO . MAC,§7.1 宏匯編,PU
22、RGE偽操作PURGE偽操作用來刪除不用的宏定義?! ±?,用INCLUDE語句調用宏庫時可以用PURGE偽操作刪除在調用程序中不用的宏定義。當然它只在調用程序中起作用而不會影響宏庫的內容?! ∷母袷绞牵骸URGE 宏定義名 [ , 宏定義名 , … ],§ 7.2重復匯編,有時匯編語言程序需要連續(xù)地重復完成相同的或者幾乎完全相同的一組代碼,這時可使用重復匯編。 REPT 表達式 . . (
23、重復塊 ) . ENDM 其中表達式的值用來確定重復塊的重復次數(shù),表達式中如包含外部或未定義的項則匯編指示出錯。,§ 7.2重復匯編,例7.15 X = 0 REPT 10 X = X + 1 DB X ENDM 則匯編后產生 1 DB 1 1 DB 2 1 DB 3
24、. . . 1 DB 10,§ 7.2重復匯編,例7.16 把字符A到Z的ASCII碼填入數(shù)組TABLE?! ?CHAR = ‘A’ TABLE LABLE BYTE REPT 26 DB CHAR CHAR = CHAR + 1 EN
25、DM 經匯編產生 1 DB 41H 1 DB 42H . . . 1 DB 5AH,§7.2重復匯編,例7.18 要求建立一個100字的數(shù)組,其中每個字的內容是下一個字的地址,而最后一個字的內容是第一個字的地址?! ?ARRAY LABLE WORD REPT 99
26、 DW $ + 2 ENDM DW ARRAY 經匯編后得 1 DW $+2 1 DW $+2 . . . 1 DW $+2 DW ARRAY,§7.2重復匯編,不定重復偽操作I
27、RP偽操作 不定重復是指匯編程序把重復塊的代碼重復幾次,每次重復把重復塊中的啞元用自變量表中的一項來取代,下一次取代下一項,重復次數(shù)由自變量表中的自變量個數(shù)來確定。自變量表必須用尖括號括起來,它可以是常數(shù)、符號和字符串等。,§7.2重復匯編,IRP parameter, (重復塊) ENDM例7.19 IRP X, DB X ENDM
28、 匯編后得: 1 DB 0 1 DB 1 . . . 1 DB 9,§7.2重復匯編,不定重復偽操作IRPC偽操作 IRPC和IRP類似,但自變量表必須是字符串。重復次數(shù)由字符串中的字符個數(shù)確定,每次重復用字符串中的下一個字符取代重復塊中的啞元。,§7.2重復匯編,例7.22 IRPC K,A
29、BCD PUSH K&X ENDM 匯編后展開成: 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX,§7.2重復匯編,例7.23 宏定義: XSUB MACRO VAR1:REQ,VARS:VARARG SUB AX,VAR1 IRP SUBS, S
30、UB AX,SUBS ENDM ENDM 其中VAR1加上 :REQ后表示在調用時必須指定實元,VARS在加上 :VARARG后表示該啞元在調用時可以使用不同數(shù)目的實元。IRP與頭一個ENDM組成循環(huán),SUBS不斷地用VARS中的一項替代。,§7.2重復匯編,宏調用: XSUB 5,10,15 XSUB AX,BX,CX,DX,ELEMENT 宏展開: 1
31、SUB AX,5 2 SUB AX,10 2 SUB AX,15 1 SUB AX,AX 2 SUB AX,BX 2 SUB AX,CX 2 SUB AX,DX 2 SUB AX,ELEMENT,§7.3條件匯編,匯編程序能根據(jù)條件把一段源程序包括在匯編語言程序內或者把它排除在外,這里就用到條件偽操作。,§7.3條件匯編,IF
32、** 自變量 . . }自變量滿足給定條件匯編此塊 . [ ELSE ] . . }自變量不滿足給定條件匯編此塊 . ENDIF,§7.3條件匯編,條件偽操作中的**表示條件如下: IF 表達式 匯編程序求出表達式的值,如此值不為0則滿足條件。 IFE 表達式 如求出表達式的值為0則滿足條件。 IFDEF 符號 如符號已在程序中定義,或者已用EXTRN偽操作說明
33、 該符號是在外部定義的,則滿足條件。 IFNDEF 符號 如符號未定義或未通過 EXTRN 說明為外部符號則滿足 條件。IFB 如自變量為空則滿足條件。IFNB 如自變量不為空則滿足條件。IFIDN , 如果字符串 和字符串
34、相同,則滿足條件。IFDIF , 如果字符串 和字符串不相 同,則滿足條件。,§7.3條件匯編,條件偽操作IF的使用舉例 例7.24 宏指令MAX把三個變元中的最大值放在AX中,而且使變元數(shù)不同時產生不同的程序段?! 『甓x:MAX MACRO N , A , B , CLOCAL NEXT,OUTMOV AX,AIF N-1IF
35、 N-2CMP C,AXJLE NEXTMOV AX,CENDIFNEXT: CMP B,AXJLE OUTMOV AX,BENDIFOUT:ENDM,宏調用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R,§7.3條件匯編,宏展開:MAX 1,P ;N
36、-1 = 0,第一層IF不滿足條件1 MOV AX,P1 OUT: MAX 2,P,Q ;N-2 = 0,第二層IF不滿足條件1 MOV AX,P1 NEXT: 1 CMP Q,AX1 JLE OUT1 MOV AX,Q 1 OUT:,§7.3條件匯編,MAX 3,P,Q,R ;第一、第二層均滿足條件 1 MOV AX,P 1 CMP
37、 R,AX 1 JLE NEXT 1 MOV AX,R 1 NEXT: 1 CMP Q,AX 1 JLE OUT 1 MOV AX,Q 1 OUT:,§7.3條件匯編,例7.25 宏指令BRANCH產生一條轉向X的轉移指令。當它相對于X的距離小于128字節(jié)時產生JMP SHORT X;否則產生JMP NEAR P
38、TR X?! 『甓x: BRANCH MACRO X IF ( $-X ) LT 128 JMP SHORT X ELSE JMP NEAR PTR X ENDIF ENDM 宏調用: BRANCH A
39、A 宏展開: 1 JMP SHORT AA 否則產生 1 JMP NEAR PTR AA,§7.3條件匯編,例7.26 宏指令POWER可以用來實現(xiàn)X和2N相乘。這只需對X左移N次即可實現(xiàn),可以設COUNT為遞歸次數(shù)的計數(shù)值,當該數(shù)與N相乘時就可結束遞歸調用?! 『甓x: POWER MACRO X, N
40、 SAL X, 1 COUNT = COUNT + 1 IF COUNT - N POWER X, N ENDIF ENDM 宏調用: COUNT = 0 POWER AX,3 宏展開: 1 SAL AX,1 2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論