版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第七章 高級(jí)匯編語(yǔ)言技術(shù),子程序結(jié)構(gòu)有很多優(yōu)點(diǎn) 提供模塊化程序設(shè)計(jì)的條件,便于程序調(diào)試及維護(hù)等。編程效率高,可以節(jié)省存儲(chǔ)空間及程序設(shè)計(jì)所花的時(shí)間。 但使用子程序也有一些不足: 增加了一些額外開(kāi)銷,包括轉(zhuǎn)子及返回、保存及恢復(fù)寄存器現(xiàn)場(chǎng)以及參數(shù)的傳送等。,§7.1 宏匯編§7.2 重復(fù)匯編§7.3 條件匯編,宏(Macro)是匯編語(yǔ)言的一個(gè)特點(diǎn),它是與子程序類似又獨(dú)具特色的另一
2、種簡(jiǎn)化源程序的方法,——統(tǒng)稱宏結(jié)構(gòu),,§7.1 宏匯編,宏定義源程序中一段有獨(dú)立功能的程序代碼組成宏。它只需定義一次,就可以用一條宏指令多次調(diào)用它?! 『甓x用一組偽操作來(lái)實(shí)現(xiàn)?! 「袷剑骸 『甓x名 MACRO [ 啞元表 ] . .(宏定義體) . ENDM,§7.1 宏匯編,例7.1 用宏指令定義兩個(gè)字操作數(shù)相乘,得到一個(gè)16
3、位的第三個(gè)操作數(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 ;第一個(gè)操作數(shù)在CX中1 IMUL VAR ??;第二個(gè)操作數(shù)是變量VAR MOV XYZ[BX], AX ??;結(jié)果存入實(shí)參XYZ[BX]1 POP
7、AX1 POP DX,2PUSH DXPUSH AX2MOV AX,240 ;第一個(gè)操作數(shù)是立即數(shù)240IMUL BX ;第二個(gè)操作數(shù)在BX中2MOV SAVE, AX ;結(jié)果存入變量SAVE2POP AX2POP DX,§7.1 宏匯編,一般說(shuō)來(lái),實(shí)元的個(gè)數(shù)和啞元的個(gè)數(shù)相等
8、,但匯編程序并不要求它們必須相等。若實(shí)元個(gè)數(shù)大于啞元個(gè)數(shù),則多余的實(shí)元不予考慮;若實(shí)元個(gè)數(shù)小于啞元個(gè)數(shù),則多余的啞元作"空"處理?! ×硗庑枰⒁獾氖牵暾归_(kāi)后,即用實(shí)元取代啞元后,所得到的語(yǔ)句應(yīng)該是有效的,即匯編語(yǔ)法應(yīng)是正確的,否則匯編程序?qū)?huì)指示出錯(cuò)。,§7.1 宏匯編,TESTMACROVAR1,VAR2mov ah,var1mov bh,var2cmp ah,bh
9、jne exitmov ah,01hexit:mov ah,02hENDM,§7.1 宏匯編,,,,僅是源程序級(jí)的簡(jiǎn)化:宏調(diào)用在匯編時(shí)進(jìn)行程序語(yǔ)句的展開(kāi),不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒(méi)有改變通過(guò)形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變,還是目標(biāo)程序級(jí)的簡(jiǎn)化:子程序調(diào)用在執(zhí)行時(shí)由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞參數(shù),
10、,,宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問(wèn)題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序,§7.1 宏匯編,宏定義中的參數(shù)宏定義可以無(wú)變?cè) ? SAVEREG MACRO ??;啞元表為空 PUSH AX PUSH BX PUSH
11、 CX PUSH DX PUSH SI PUSH DI ENDM 宏調(diào)用: SAVEREG,§7.1 宏匯編,宏定義中的參數(shù)變?cè)梢允遣僮鞔a TEST MACRO P1,P2,P3 MOV AX,P1 P2 P3 ??;
12、變?cè)狿2為操作碼ENDM 宏調(diào)用:TEST WORD_VAR,INC,AX 宏展開(kāi):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 宏展開(kāi):
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形成無(wú)條件跳轉(zhuǎn)
15、 指令中的標(biāo)號(hào) ENDM 宏調(diào)用: FO WORD_VAR 宏展開(kāi): 1 JMP TAWORD_VAR ;TA與實(shí)元
16、 WORD_VAR形成標(biāo)號(hào) TAWORD_VAR 在這里,如果宏定義寫(xiě)為 FO MACRO P1 JMP TAP1 ENDM 則在展開(kāi)時(shí),匯編程
17、序把TAP1看作是一個(gè)獨(dú)立的標(biāo)號(hà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ù)的絕對(duì)值 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,宏展開(kāi):1 PUSH DX1 PUSH AX2 MOV AX,VAR12 SUB AX,VAR21 IMUL AX1 MOV VAR3,AX
21、1 POP AX1 POP DX,§7.1 宏匯編,宏庫(kù)的建立與調(diào)用 有時(shí),程序里定義了較多宏,或者可以把自己編程中常用的宏定義建立成一個(gè)獨(dú)立的文件,這個(gè)只包含若干宏定義的文件稱為宏庫(kù),通常用擴(kuò)展名MAC或INC來(lái)表示。當(dāng)應(yīng)用程序中需要用到宏庫(kù)中的某些宏定義時(shí),只需要在該程序的開(kāi)始用INCLUDE語(yǔ)句說(shuō)明如下: INCLUDE C: \ MACRO . MAC,§7.1 宏匯編,PU
22、RGE偽操作PURGE偽操作用來(lái)刪除不用的宏定義?! ±?,用INCLUDE語(yǔ)句調(diào)用宏庫(kù)時(shí)可以用PURGE偽操作刪除在調(diào)用程序中不用的宏定義。當(dāng)然它只在調(diào)用程序中起作用而不會(huì)影響宏庫(kù)的內(nèi)容。 它的格式是: PURGE 宏定義名 [ , 宏定義名 , … ],§ 7.2重復(fù)匯編,有時(shí)匯編語(yǔ)言程序需要連續(xù)地重復(fù)完成相同的或者幾乎完全相同的一組代碼,這時(shí)可使用重復(fù)匯編。 REPT 表達(dá)式 . . (
23、重復(fù)塊 ) . ENDM 其中表達(dá)式的值用來(lái)確定重復(fù)塊的重復(fù)次數(shù),表達(dá)式中如包含外部或未定義的項(xiàng)則匯編指示出錯(cuò)。,§ 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 要求建立一個(gè)100字的數(shù)組,其中每個(gè)字的內(nèi)容是下一個(gè)字的地址,而最后一個(gè)字的內(nèi)容是第一個(gè)字的地址?! ?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)來(lái)取代,下一次取代下一項(xiàng),重復(fù)次數(shù)由自變量表中的自變量個(gè)數(shù)來(lái)確定。自變量表必須用尖括號(hào)括起來(lái),它可以是常數(shù)、符號(hào)和字符串等。,§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ù)由字符串中的字符個(gè)數(shù)確定,每次重復(fù)用字符串中的下一個(gè)字符取代重復(fù)塊中的啞元。,§7.2重復(fù)匯編,例7.22 IRPC K,A
29、BCD PUSH K&X ENDM 匯編后展開(kāi)成: 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í)必須指定實(shí)元,VARS在加上 :VARARG后表示該啞元在調(diào)用時(shí)可以使用不同數(shù)目的實(shí)元。IRP與頭一個(gè)ENDM組成循環(huán),SUBS不斷地用VARS中的一項(xiàng)替代。,§7.2重復(fù)匯編,宏調(diào)用: XSUB 5,10,15 XSUB AX,BX,CX,DX,ELEMENT 宏展開(kāi): 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ù)條件把一段源程序包括在匯編語(yǔ)言程序內(nèi)或者把它排除在外,這里就用到條件偽操作。,§7.3條件匯編,IF
32、** 自變量 . . }自變量滿足給定條件匯編此塊 . [ ELSE ] . . }自變量不滿足給定條件匯編此塊 . ENDIF,§7.3條件匯編,條件偽操作中的**表示條件如下: IF 表達(dá)式 匯編程序求出表達(dá)式的值,如此值不為0則滿足條件。 IFE 表達(dá)式 如求出表達(dá)式的值為0則滿足條件。 IFDEF 符號(hào) 如符號(hào)已在程序中定義,或者已用EXTRN偽操作說(shuō)明
33、 該符號(hào)是在外部定義的,則滿足條件。 IFNDEF 符號(hào) 如符號(hào)未定義或未通過(guò) EXTRN 說(shuō)明為外部符號(hào)則滿足 條件。IFB 如自變量為空則滿足條件。IFNB 如自變量不為空則滿足條件。IFIDN , 如果字符串 和字符串
34、相同,則滿足條件。IFDIF , 如果字符串 和字符串不相 同,則滿足條件。,§7.3條件匯編,條件偽操作IF的使用舉例 例7.24 宏指令MAX把三個(gè)變?cè)械淖畲笾捣旁贏X中,而且使變?cè)獢?shù)不同時(shí)產(chǎn)生不同的程序段?! 『甓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,宏調(diào)用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R,§7.3條件匯編,宏展開(kāi):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)它相對(duì)于X的距離小于128字節(jié)時(shí)產(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 宏展開(kāi): 1 JMP SHORT AA 否則產(chǎn)生 1 JMP NEAR PTR AA,§7.3條件匯編,例7.26 宏指令POWER可以用來(lái)實(shí)現(xiàn)X和2N相乘。這只需對(duì)X左移N次即可實(shí)現(xiàn),可以設(shè)COUNT為遞歸次數(shù)的計(jì)數(shù)值,當(dāng)該數(shù)與N相乘時(shí)就可結(jié)束遞歸調(diào)用。 宏定義: 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 宏展開(kāi): 1 SAL AX,1 2
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
評(píng)論
0/150
提交評(píng)論