版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第七章 高級匯編語言技術(shù),子程序結(jié)構(gòu)有很多優(yōu)點(diǎn) 提供模塊化程序設(shè)計(jì)的條件,便于程序調(diào)試及維護(hù)等。編程效率高,可以節(jié)省存儲空間及程序設(shè)計(jì)所花的時間。 但使用子程序也有一些不足: 增加了一些額外開銷,包括轉(zhuǎn)子及返回、保存及恢復(fù)寄存器現(xiàn)場以及參數(shù)的傳送等。,§7.1 宏匯編§7.2 重復(fù)匯編§7.3 條件匯編,宏(Macro)是匯編語言的一個特點(diǎn),它是與子程序類似又獨(dú)具特色的另一
2、種簡化源程序的方法,——統(tǒng)稱宏結(jié)構(gòu),,§7.1 宏匯編,宏定義源程序中一段有獨(dú)立功能的程序代碼組成宏。它只需定義一次,就可以用一條宏指令多次調(diào)用它。 宏定義用一組偽操作來實(shí)現(xiàn)?! 「袷剑骸 『甓x名 MACRO [ 啞元表 ] . .(宏定義體) . ENDM,§7.1 宏匯編,例7.1 用宏指令定義兩個字操作數(shù)相乘,得到一個16
3、位的第三個操作數(shù)作為結(jié)果。宏定義: 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 宏匯編,宏調(diào)用 . . . MULTIPLY CX, VAR, XYZ[BX] ;第一次宏調(diào)用 . . MULTIPLY 240, BX
6、, SAVE ;第二次宏調(diào)用 . .,§7.1 宏匯編,PUSH DX1 PUSH AX MOV AX,CX ;第一個操作數(shù)在CX中1 IMUL VAR ;第二個操作數(shù)是變量VAR MOV XYZ[BX], AX ?。唤Y(jié)果存入實(shí)參XYZ[BX]1 POP
7、AX1 POP DX,2PUSH DXPUSH AX2MOV AX,240 ;第一個操作數(shù)是立即數(shù)240IMUL BX ??;第二個操作數(shù)在BX中2MOV SAVE, AX ;結(jié)果存入變量SAVE2POP AX2POP DX,§7.1 宏匯編,一般說來,實(shí)元的個數(shù)和啞元的個數(shù)相等
8、,但匯編程序并不要求它們必須相等。若實(shí)元個數(shù)大于啞元個數(shù),則多余的實(shí)元不予考慮;若實(shí)元個數(shù)小于啞元個數(shù),則多余的啞元作"空"處理?! ×硗庑枰⒁獾氖?,宏展開后,即用實(shí)元取代啞元后,所得到的語句應(yīng)該是有效的,即匯編語法應(yīng)是正確的,否則匯編程序?qū)甘境鲥e。,§7.1 宏匯編,TESTMACROVAR1,VAR2mov ah,var1mov bh,var2cmp ah,bh
9、jne exitmov ah,01hexit:mov ah,02hENDM,§7.1 宏匯編,,,,僅是源程序級的簡化:宏調(diào)用在匯編時進(jìn)行程序語句的展開,不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒有改變通過形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡捷直觀、靈活多變,還是目標(biāo)程序級的簡化:子程序調(diào)用在執(zhí)行時由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲單元或堆棧等傳遞參數(shù),
10、,,宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時,應(yīng)選用宏;當(dāng)程序段較長或?yàn)闇p小目標(biāo)代碼時,要選用子程序,§7.1 宏匯編,宏定義中的參數(shù)宏定義可以無變元 SAVEREG MACRO ;啞元表為空 PUSH AX PUSH BX PUSH
11、 CX PUSH DX PUSH SI PUSH DI ENDM 宏調(diào)用: SAVEREG,§7.1 宏匯編,宏定義中的參數(shù)變元可以是操作碼 TEST MACRO P1,P2,P3 MOV AX,P1 P2 P3 ;
12、變元P2為操作碼ENDM 宏調(diào)用:TEST WORD_VAR,INC,AX 宏展開:1 MOV AX,WORD_VAR1 INC AX ;用實(shí)元INC取代啞元 P2,形成INC指令,§7.1 宏匯編,宏定義中的參數(shù)LP MACRO
13、 COND,LAB J&COND LAB ??;J與啞元COND由&相連,形成該指令 操作碼ENDM 宏調(diào)用: LP Z,THERE LP NZ,HERE 宏展開:
14、 1 JZ THERE ;J與實(shí)元Z形成JZ條件指令 1 JNZ HERE ??;J與實(shí)元NZ形成JNZ條件指令,§7.1 宏匯編,例7.5 宏定義: FO MACRO P1 JMP TA&P1 ;TA與啞元P1形成無條件跳轉(zhuǎn)
15、 指令中的標(biāo)號 ENDM 宏調(diào)用: FO WORD_VAR 宏展開: 1 JMP TAWORD_VAR ;TA與實(shí)元
16、 WORD_VAR形成標(biāo)號 TAWORD_VAR 在這里,如果宏定義寫為 FO MACRO P1 JMP TAP1 ENDM 則在展開時,匯編程
17、序把TAP1看作是一個獨(dú)立的標(biāo)號,并不把TAP1中的P1作為啞元看待,這樣就不能得到預(yù)期的結(jié)果。,§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 ??;如果是負(fù)數(shù),則求補(bǔ) NEXT: ADD AX,OPERENDMABSOL BXABSOL CX,§7.1 宏匯編,在宏
19、定義內(nèi)使用宏 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 宏調(diào)用: 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 宏匯編,宏庫的建立與調(diào)用 有時,程序里定義了較多宏,或者可以把自己編程中常用的宏定義建立成一個獨(dú)立的文件,這個只包含若干宏定義的文件稱為宏庫,通常用擴(kuò)展名MAC或INC來表示。當(dāng)應(yīng)用程序中需要用到宏庫中的某些宏定義時,只需要在該程序的開始用INCLUDE語句說明如下: INCLUDE C: \ MACRO . MAC,§7.1 宏匯編,PU
22、RGE偽操作PURGE偽操作用來刪除不用的宏定義?! ±?,用INCLUDE語句調(diào)用宏庫時可以用PURGE偽操作刪除在調(diào)用程序中不用的宏定義。當(dāng)然它只在調(diào)用程序中起作用而不會影響宏庫的內(nèi)容?! ∷母袷绞牵骸URGE 宏定義名 [ , 宏定義名 , … ],§ 7.2重復(fù)匯編,有時匯編語言程序需要連續(xù)地重復(fù)完成相同的或者幾乎完全相同的一組代碼,這時可使用重復(fù)匯編。 REPT 表達(dá)式 . . (
23、重復(fù)塊 ) . ENDM 其中表達(dá)式的值用來確定重復(fù)塊的重復(fù)次數(shù),表達(dá)式中如包含外部或未定義的項(xiàng)則匯編指示出錯。,§ 7.2重復(fù)匯編,例7.15 X = 0 REPT 10 X = X + 1 DB X ENDM 則匯編后產(chǎn)生 1 DB 1 1 DB 2 1 DB 3
24、. . . 1 DB 10,§ 7.2重復(fù)匯編,例7.16 把字符A到Z的ASCII碼填入數(shù)組TABLE?! ?CHAR = ‘A’ TABLE LABLE BYTE REPT 26 DB CHAR CHAR = CHAR + 1 EN
25、DM 經(jīng)匯編產(chǎn)生 1 DB 41H 1 DB 42H . . . 1 DB 5AH,§7.2重復(fù)匯編,例7.18 要求建立一個100字的數(shù)組,其中每個字的內(nèi)容是下一個字的地址,而最后一個字的內(nèi)容是第一個字的地址?! ?ARRAY LABLE WORD REPT 99
26、 DW $ + 2 ENDM DW ARRAY 經(jīng)匯編后得 1 DW $+2 1 DW $+2 . . . 1 DW $+2 DW ARRAY,§7.2重復(fù)匯編,不定重復(fù)偽操作I
27、RP偽操作 不定重復(fù)是指匯編程序把重復(fù)塊的代碼重復(fù)幾次,每次重復(fù)把重復(fù)塊中的啞元用自變量表中的一項(xiàng)來取代,下一次取代下一項(xiàng),重復(fù)次數(shù)由自變量表中的自變量個數(shù)來確定。自變量表必須用尖括號括起來,它可以是常數(shù)、符號和字符串等。,§7.2重復(fù)匯編,IRP parameter, (重復(fù)塊) ENDM例7.19 IRP X, DB X ENDM
28、 匯編后得: 1 DB 0 1 DB 1 . . . 1 DB 9,§7.2重復(fù)匯編,不定重復(fù)偽操作IRPC偽操作 IRPC和IRP類似,但自變量表必須是字符串。重復(fù)次數(shù)由字符串中的字符個數(shù)確定,每次重復(fù)用字符串中的下一個字符取代重復(fù)塊中的啞元。,§7.2重復(fù)匯編,例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重復(fù)匯編,例7.23 宏定義: XSUB MACRO VAR1:REQ,VARS:VARARG SUB AX,VAR1 IRP SUBS, S
30、UB AX,SUBS ENDM ENDM 其中VAR1加上 :REQ后表示在調(diào)用時必須指定實(shí)元,VARS在加上 :VARARG后表示該啞元在調(diào)用時可以使用不同數(shù)目的實(shí)元。IRP與頭一個ENDM組成循環(huán),SUBS不斷地用VARS中的一項(xiàng)替代。,§7.2重復(fù)匯編,宏調(diào)用: 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ù)條件把一段源程序包括在匯編語言程序內(nèi)或者把它排除在外,這里就用到條件偽操作。,§7.3條件匯編,IF
32、** 自變量 . . }自變量滿足給定條件匯編此塊 . [ ELSE ] . . }自變量不滿足給定條件匯編此塊 . ENDIF,§7.3條件匯編,條件偽操作中的**表示條件如下: IF 表達(dá)式 匯編程序求出表達(dá)式的值,如此值不為0則滿足條件。 IFE 表達(dá)式 如求出表達(dá)式的值為0則滿足條件。 IFDEF 符號 如符號已在程序中定義,或者已用EXTRN偽操作說明
33、 該符號是在外部定義的,則滿足條件。 IFNDEF 符號 如符號未定義或未通過 EXTRN 說明為外部符號則滿足 條件。IFB 如自變量為空則滿足條件。IFNB 如自變量不為空則滿足條件。IFIDN , 如果字符串 和字符串
34、相同,則滿足條件。IFDIF , 如果字符串 和字符串不相 同,則滿足條件。,§7.3條件匯編,條件偽操作IF的使用舉例 例7.24 宏指令MAX把三個變元中的最大值放在AX中,而且使變元數(shù)不同時產(chǎn)生不同的程序段。 宏定義: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,宏調(diào)用: 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產(chǎn)生一條轉(zhuǎn)向X的轉(zhuǎn)移指令。當(dāng)它相對于X的距離小于128字節(jié)時產(chǎn)生JMP SHORT X;否則產(chǎn)生JMP NEAR P
38、TR X。 宏定義: BRANCH MACRO X IF ( $-X ) LT 128 JMP SHORT X ELSE JMP NEAR PTR X ENDIF ENDM 宏調(diào)用: BRANCH A
39、A 宏展開: 1 JMP SHORT AA 否則產(chǎn)生 1 JMP NEAR PTR AA,§7.3條件匯編,例7.26 宏指令POWER可以用來實(shí)現(xiàn)X和2N相乘。這只需對X左移N次即可實(shí)現(xiàn),可以設(shè)COUNT為遞歸次數(shù)的計(jì)數(shù)值,當(dāng)該數(shù)與N相乘時就可結(jié)束遞歸調(diào)用?! 『甓x: POWER MACRO X, N
40、 SAL X, 1 COUNT = COUNT + 1 IF COUNT - N POWER X, N ENDIF ENDM 宏調(diào)用: COUNT = 0 POWER AX,3 宏展開: 1 SAL AX,1 2
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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
提交評論