第7章高級匯編技術(shù)_第1頁
第7章高級匯編技術(shù)_第2頁
第7章高級匯編技術(shù)_第3頁
第7章高級匯編技術(shù)_第4頁
第7章高級匯編技術(shù)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章高級匯編語言技術(shù)一、宏匯編 宏定義是用一組偽操作來實現(xiàn)的。其格式是: macro_name MACRO dumny_parameter_list . (宏定義體) ENDM其中MACRO和ENDM是一對偽操作.這對偽操作之間是宏定義體-是一組獨(dú)立功能的程序代碼.宏指令名(macro_name)給出該宏定義的名稱,調(diào)用時就使用宏指令名來調(diào)用該宏定義.其中啞元表(dumny_parameter_list)給出了該宏定義中所用到的形式參數(shù)(或稱虛參),每個啞元之間用逗號隔開. 經(jīng)宏定義后的宏指令就可以在源程序中調(diào)用.這種對宏指令的調(diào)用稱為宏調(diào)用,宏調(diào)用的格式是: macro_name actu

2、al_parameter_list實元表(actual_parameter_list)中的每一項為實元,相互之間用逗號隔開.1.宏定義可以無變元宏定義: SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM宏調(diào)用: SAVEREG2.變元可以是操作碼宏定義: FOO MACRO P1,P2,P3 MOV AX,P1 P2 P3 ENDM宏調(diào)用: FOO WORD_VAR,INC,AX宏展開: + MOV AX,WORD_VAR + INC AX3.變元可以是操作碼的一部分,但在宏定義體中必須用&作為分隔符.宏定義:

3、 LEAP MACRO COND,LAB J&COND LAB ENDM宏調(diào)用: . LEAP Z,THERE . LEAP NZ,HERE .宏展開: . + JZ THERE . + JNZ HERE .4.&是一個操作符,它在宏定義體中可以作為啞元的前綴,展開時可以把&前后個符號合并而形成一個符號,這個符號可以是操作碼,操作數(shù)或是一個字符串宏定義: PO MACRO P1 JMP TA&P1 ENDM宏調(diào)用: FO WORD_VAR宏展開: + JMP TAWORD_VAR5.實元是ASCII串的情況宏定義: MSGGEN MACRO LAB,NUM,XYZ LAB&NUM DB HEL

4、LO MR.&XYZ ENDM宏調(diào)用: MSGGEN MSG,1,TAYLOR宏展開: + MSG1 DB HELLO MR.TAYLOR6.宏指令名可以與指令助記符或偽操作名相同,在這種情況下,宏指令的優(yōu)先級最高,而同名的指令或偽操作就失效了.偽操作PURGE可以用來在適當(dāng)?shù)臅r候取消宏定義,以便恢復(fù)指令的原始含義.宏定義: ADD MACRO OPR1,OPR2,RESULT . ENDM宏調(diào)用: . ADD XX,YY,ZZ PURGE ADD .在宏調(diào)用后,用PURGE偽操作取消定義,以便恢復(fù)ADD指令的原始含義,在PURGE ADD后面所用的ADD指令,則服從機(jī)器指令的定義. PURG

5、E偽操作可同時取消多個宏操作,此時各宏指令之間用逗號隔開.7.LOCAL偽操作的使用.宏定義體內(nèi)允許使用標(biāo)號,如:宏定義: ABSOL MACRO OPER CMP OPER,O JGE NEXT NEG OPER NEXT: ENDM如果程序中多次調(diào)用該宏定義時,展開后會出現(xiàn)標(biāo)號的多重定義.為此系統(tǒng)提供了LOCAL偽操作,其格式是 LOCAL list of local labels其中局部標(biāo)號表內(nèi)的各標(biāo)號之間用逗號隔開.匯編程序?qū)OCAL偽操作的局部標(biāo)號表中的每一個局部標(biāo)號建立唯一的符號(用?0000?FFFF)以代替在展開中存在的每個局部標(biāo)號.必須注意,LOCAL偽操作只能用在宏定義體

6、內(nèi),而且它必須是MACRO偽操作后的第一個語句,在MACRO和LOCAL偽操作之間還不允許有注釋和分號標(biāo)志. 本例中的ABSOL宏定義在考慮有多次調(diào)用可能性的情況下,應(yīng)定義為: ABSOL MACRO OPER LOCAL NEXT CMP OPER,0 JGE NEXT NEG OPER NEXT: ENDM宏調(diào)用: . ABSOL VAR . ABSOL BX .宏展開: . + CMP VAR,0 + JGE ?0000 + NEG VAR +?0000: . + CMP BX,0 + JGE ?0001 + NEG BX +?0001: .8.宏定義中允許使用宏調(diào)用,其限制條件是:必須

7、先定義后調(diào)用宏定義: DIF MACRO X,Y MOV AX,X SUB AX,Y ENDMDIFSQR MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX DIF OPR1,OPR2 IMUL AX MOV RESULT,AX POP AX POP DX ENDM宏調(diào)用: DIFSQR VAR1,VAR2,VAR39.宏定義體內(nèi)不僅可以使用宏調(diào)用,也可以包含宏定義.宏定義: DEFMAC MACRO MACNAM,OPERATOR MACNAM MACRO X,Y,Z PUSH AX MOV AX,X OPERATOR AX,Y MOV Z,AX POP AX E

8、NDM ENDM其中MACNAM是內(nèi)層的宏定義名,但又是外層宏定義的啞元,所以調(diào)用DEFMAC時,就形成一個宏定義.宏調(diào)用: DEFMAC ADDITION,ADD宏展開: + ADDITION MACRO X,Y,Z PUSH AX MOV AX,X ADD AX,Y MOV Z,AX POP AX ENDM形成加法宏定義ADDITION.同樣,宏調(diào)用 DEFMAC SUBTRACT,SUB形成減法的宏定義.當(dāng)然在形成這些宏定義后,就可以使用宏調(diào)用 ADDITION VAR1,VAR2,VAR3而展開成: + PUSH AX + MOV AX,VAR1 + ADD AX,VAR2 + MOV

9、 VAR3,AX + POP AX10.這里再介紹一個宏定義的變元中使用的偽操作%,它的格式是: %expression匯編程序把跟在%之后的表達(dá)式的值轉(zhuǎn)換成當(dāng)前基數(shù)下的數(shù),在展開期間,用這個數(shù)來取代啞元.宏定義: MSG MACRO COUNT,STRING MSG&COUNT DB STRING ENDM ERRMSG MACRO TEXT CNTR=CNTR+1 MSG % CNTR,TEXT ENDM宏調(diào)用: . CNTR=0 ERRMSG SYNTAX ERROR . ERRMSG INVALID OPERAND .宏展開: . + MSG1 DB SYNTAX ERROR . +

10、MSG2 DB INVALID OPERAND .二、重復(fù)匯編 有時匯編語言程序需要連續(xù)地重復(fù)完全相同的或者幾乎完全相同的一組代碼,這時可使用重復(fù)匯編。1.重復(fù)偽操作其格式為: REPT expression . (重復(fù)塊) ENDM其中表達(dá)式的值用來確定重復(fù)塊的重復(fù)次數(shù),表達(dá)式中如包含外部或未定義的項則匯編指示出錯. 重復(fù)偽操作并不一定要在宏定義體內(nèi),例如:X=0 REPT 10X=X+1 DB X ENDM則匯編后產(chǎn)生 + DB 1 + DB 2 + DB 3 . + DB 10把字符A到Z的ASCII碼填入數(shù)組TABLECHAR=ATABLE LABEL BYTE REPT 26 DB

11、CHAR CHAR=CHAR+1 ENDM用宏定義及重復(fù)偽操作把TAB,TAB+1,TAB+2,.,TAB+16的內(nèi)容存入堆棧.宏定義: PUSH_TAB MACRO K PUSH TAB+K ENDM宏調(diào)用: I=0 REPT 17 PUSH_TAB % I I=I+1 ENDM要求建立一個100D字的數(shù)組,其中每個字的內(nèi)容是下一個字的地址,而最后一個字的內(nèi)容是第一個字的地址.ARRAY LABEL WORD REPT 99 DW $+2 ENDM DW ARRAY 2.不定重復(fù)偽操作 (1)IRP偽操作格式是: IRP dummy, . (重復(fù)塊) ENDM匯編程序把重復(fù)塊的代碼重復(fù)幾次,

12、每次重復(fù)把重復(fù)塊中的啞元用自變量表中的一項來取代,下一次取代下一項,重復(fù)次數(shù)由自變量表中的自變量個數(shù)來確定.自變量表必須用尖括號括起,它可以是常數(shù),符號,字符串等.例1: IRP X, DB X ENDM匯編后得: + DB 1 + DB 2 . + DB 10例2: IRP REG, PUSH REG ENDM匯編后得: + PUSH AX + PUSH BX + PUSH CX + PUSH DX (2)IRPC偽操作格式是: IRPC dummy,string(或) . (重復(fù)塊) ENDMIRPC和IRP類似,但自變量表必須是字符串.重復(fù)次數(shù)由字符串中的字符個數(shù)確定,每次重復(fù)用字符串中

13、的下一個字符取代重復(fù)塊中的啞元.例:例1: IRPC X,0 1 2 3 4 5 6 7 DB X+1 ENDM匯編后得: + DB 1 + DB 2 . + DB 8例2: IRPC K,A B C D PUSH K&X匯編后展開形成: + PUSH AX + PUSH BX + PUSH CX + PUSH DX三、條件匯編 匯編程序能根據(jù)條件把一段源程序包括在匯編語言程序內(nèi)或者把它排除在外,這里就用到條件偽操作.條件偽操作的一般格式是: IFXX argument . 自變量滿足給定條件匯編此塊 ELSE . 自變量不滿足給定條件匯編此塊 ENDIF自變量必須在匯編程序第一啟遍掃視后就成

14、為確定的數(shù)值.條件偽操作中的XX表示條件如下: IF expression 匯編程序求出表達(dá)式的值,如此值不為0則滿足條件. IFE expression 如求出表達(dá)式的值為0則滿足條件. IFDEF symbol 如符號已在程序中定義,或者已用EXTRN偽操作說明該符號是在外部定義的,則 滿足條件. IFNDEF symbol 如符號未定義或未通過EXTRN說明為外部符號則滿足條件. IFB 如自變量為空則滿足條件 IFNB 如自變量不為空則滿足條件 IFIDN , 如果字符串和字符串相同,則滿足條件. IFDIF , 如果字符串和字符串不相同,則滿足條件.條件偽操作可以用在宏定義體內(nèi),也可

15、以用在宏定義體外,也允許嵌套任意次.例1:宏指令MAX把三個變元中的最大值放在AX中,而且使變元數(shù)不同時產(chǎn)生不同的程序段.宏定義: MAX MACRO K,A,B,C LOCAL NEXT,OUT MOV AX,A IF K-1 IF K-2 CMP C,AX JLE NEXT MOV AX,C ENDIF NEXT: CMP B,AX JLE OUT MOV AX,B ENDIF OUT: ENDM宏調(diào)用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R宏展開: MAX 1,P + MOV AX,P +?0001: MAX 2,P,Q + MOV AX,P +?0002:CMP

16、Q,AX + JLE ?0003 + MOV AX,Q +?0003: MAX 3,P,Q,R + MOV AX,P + CMP R,AX + JLE ?0004 + MOV AX,R +?0004:CMP Q,AX + JLE ?0005 + MOV AX,Q +?0005:例2.宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根據(jù)不同情況產(chǎn)生無條件轉(zhuǎn)移指令或比較和條件轉(zhuǎn)移指令.宏定義: GOTO MACRO L,X,REL,Y JFB JMP L ELSE MOV AX,X CMP AX,Y J&REL L ENDIF ENDM宏調(diào)用: . GOTO LOOP,SUM,NZ,15 . GOTO EXIT .宏展開: . + MOV AX,SUM + CMP AX,15 + JNZ LOOP . + JMP EXIT例3.宏定義可允許遞歸調(diào)用,此時條件偽操作可用來結(jié)束宏遞歸 宏指令POWER可以用來實現(xiàn)X和2N相乘.這只需對X左移N次可實現(xiàn),可以設(shè)COUNT為遞歸次數(shù)的計數(shù)值,當(dāng)該數(shù)與N相等時即可結(jié)束遞歸調(diào)用.宏定義: POWER MACRO X,N SAL X,1 COUTN=COUT+1 IF COUNT-N POWER X,N ENDIF ENDM宏調(diào)用: COUTN=0 POWER AX,3宏展開: + SAL AX,1 + SAL A

溫馨提示

  • 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

提交評論