高級匯編語言程序設計和宏結構的作用_第1頁
高級匯編語言程序設計和宏結構的作用_第2頁
高級匯編語言程序設計和宏結構的作用_第3頁
高級匯編語言程序設計和宏結構的作用_第4頁
高級匯編語言程序設計和宏結構的作用_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、高級匯編語言程序設計和宏結構的作用1 在掌握基本的匯編語言程序設計方法之后,進一步學習如何提高編程效率的各種實用方法。2宏 匯 編重 復 匯 編條 件 匯 編3宏匯編重復匯編條件匯編統(tǒng)稱宏結構宏(Macro)是匯編語言的一個特點,它是與子程序類似又獨具特色的另一種簡化源程序的方法宏具有宏名的一段匯編語句序列(宏定義時書寫)宏指令這段匯編語句序列的縮寫(宏調用時書寫)宏展開宏指令處用這段宏代替的過程(宏匯編時實現(xiàn))宏的參數(shù)功能強大,頗具特色配合宏,還有宏操作符和有關偽指令5. 1 宏匯編宏(Macro)是源程序中一段有獨立功能的程序代碼。它只需在源程序中定義一次,就可以多次調用它,調用時只需用一

2、個宏指令語句就可以了。宏定義是用一組偽操作來實現(xiàn)的其格式是:宏名macro 形參表宏定義體endm其中macro和endm是一對偽操作,這對偽操作之間是宏定義體(一組有獨立功能的程序代碼)宏名給該宏定義的名稱,調用時就使用宏名來調用該宏定義。宏名的第一個符號必須是字母,其后可以跟字母、數(shù)字和下劃線字符。6MAINBEGINGMACRO ;定義名為MAINBEGIN的宏,無參數(shù)MOV AX,DATA;宏定義體MOV DS,AXENDM;宏定義結束MAINENDMACRO RETNUM;帶有形參RETNUMMOV AL,RETNUM;宏定義中使用參數(shù)MOV AH,4CHINT 21HENDM7MU

3、LTIPLYMACRO OPR1,OPR2,RESULT ;定義名具有三個參數(shù)的宏 PUSH DX ;宏定義體 PUSH AX MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX ENDM ;宏定義結束宏名實參表宏調用經宏定義定義后的宏指令可以在源程序中調用,這種對宏指令的調用稱為宏調用。其格式為:宏調用的實質是在匯編過程中進行宏展開9例:START:MAINBEGIN;宏調用,建立DS內容MULTIPLY 240,BX,SAVE ;宏調用,顯示字符串MAINEND 0;宏調用,返回DOSEND START 宏調用的實質是在匯編過程中進行宏展開

4、宏展開在匯編時,用宏定義體的代碼序列取代源程序中的宏指令名,而且用實際參數(shù)取代形式參數(shù)的過程。宏展開的具體過程是:當匯編程序掃描源程序遇到已有定義的宏調用時,即用相應的宏定義體取代源程序的宏指令,同時用位置匹配的實參對形參進行取代,而且在取代時,實參與形參是一一對應的。11START:1MOV AX,DATA ;宏指令MAINBEGIN的宏展開1MOV DS,AX1 PUSH DX ;宏指令MULTIPLY的宏展開1 PUSH AX1 MOV AX,OPR11 IMUL OPR21 MOV RESULT,AX1 POP AX1 POP DX1MOV AL,0;宏指令MAINEND 0 的宏展開

5、1MOV AH,4CH1INT 21HEND START宏的參數(shù):宏的參數(shù)使用非常靈活宏定義時,可以無參數(shù),例如:MAINBEGIN可以帶有一個參數(shù),例如:MAINEND也可以具有多個參數(shù);例如:MULTIPLY參數(shù)可以是常數(shù)、變量、存儲單元、指令(操作碼)或它們的一部分,也可以是表達式;宏定義體可以是任何合法的匯編語句,既可以是硬指令序列,又可以是偽指令序列;例:;宏定義SHLEXT MACRO SHLOPRAND,SHLNUMPUSH CXMOV CL,SHLNUMSHL SHLOPRAND CLPOP CXENDM;宏指令SHLEXT AX,6;宏展開 1PUSH CX 1MOV CL,

6、06 1SHL AX,CL 1POP CX;統(tǒng)一4條移位指令的宏指令(shl,shr,sal,sar)shiftmacro soprand,snum,sopcodepush cxmov cl,snums&sopcode& soprand,clpop cxendm例:宏調用:shift ax,4,ar 宏展開:1push cx 1 mov cl,4 1 sar ax,cl 1 pop cx參數(shù)可以是操作碼的一部分,但在宏定義中必須用&作為分隔符。&是一個操作符,它在宏體中可作為形參的前綴,展開時把&前后兩個符號合并形成一個符號,這個符號可是操作碼、操作數(shù)和一個字符串。替換操作符15;統(tǒng)一移位和循

7、環(huán)移位8條指令的宏指令shrotmacro sroprand,srnum,sropcodepush cxmov cl,srnumsropcode sroprand,clpop cxendm例:宏調用:shrot ax,4,rcl宏展開: 1 push cx 1 mov cl,4 1 rcl ax,cl 1 pop cx例:;宏定義dstringmacro stringdb &string&,0dh,0ah,$endm;宏調用dstringdstring 0 ! Number !;宏展開 1db This is a example., 0dh,0ah,$ 1db 0 Number 10, 0dh

8、,0ah, $轉義注釋符傳遞注釋符宏操作符;宏注釋符,用于表示在宏定義中的注釋。采用這個符號的注釋,在宏展開時不出現(xiàn)&替換操作符,用于將參數(shù)與其他字符分開。如果參數(shù)緊接在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該偽操作符宏操作符字符串傳遞操作符,用于括起字符串。在宏調用中,如果傳遞的字符串實參數(shù)含有逗號、空格等間隔符號,則必須用這對操作符,以保證字符串的完整!轉義操作符!,用于指示其后的一個字符作為一般字符,不含特殊意義%表達式操作符,用在宏調用中,表示將后跟的一個表達式的值轉換成當前基數(shù)下的數(shù)(默認為10進制)作為實參,而不是將表達式本身作為參數(shù)19例:MSG MACR

9、O COUNT,STRING;宏定義 MSG&COUNT DB STRING ENDMERRMSG MACRO TEXT CNTR =CNTR +1 MSG %CNTR,TEXT ENDM宏調用:CNTR =0 ERRMSG SYNTAX ERROR ERRMSG INVALID OPPERAND宏展開:CNTR=01 CNTR=CNTR+11 MSG %CNTR, SYNTAX ERROR2 MSG1 DB SYNTAXERROR1 CNTR=CNTR+11 MSG %CNTR,INVALID OPPERAND2 MSG2 DB INVALID OPPERAND與宏有關的偽指令局部標號偽指令

10、格式:LOCAL 標號列表(各標號之間用逗號分隔)宏定義體采用了標號,應使用LOCAL加以說明,它必須是宏定義MACRO語句之后的第一條語句。匯編程序對LOCAL偽指令的局部標號表中每個局部標號建立惟一的符號(用?0000-?FFFF)以代替在展開中存在的每一個局部標號。;宏定義absolmacro oprdlocal nextcmp oprd,0jge nextneg oprdnext:endm例:;宏調用absol word ptr bxabsol bx;宏展開 1cmp word ptr bx,0 1jge ?0000 1neg word ptr bx 1?0000: 1cmp bx,0

11、 1jge ?0001 1neg bx 1?0001:單獨占一行22宏定義刪除偽指令格式:PURGE 宏名表為了刪除匯編時引入到內存的無用的宏定義,可以用PURGE偽指令把它刪除宏定義退出偽指令格式:EXITM偽指令EXITM表示結束當前宏調用的展開23 宏指令名可以與指令助記符或偽操作名相同,在這種情況下,宏指令的優(yōu)先級最高,而同名的指令或偽操作就失效了.偽操作PURGE可以用來在適當?shù)臅r候取消宏定義,以便恢復指令的原始含義.宏定義: ADD MACRO OPR1,OPR2,RESULT . ENDM宏調用: . ADD XX,YY,ZZ PURGE ADD .24 在宏調用后,用PURGE

12、偽操作取消定義,以便恢復ADD指令的原始含義,在PURGE ADD后面所用的ADD指令,則服從機器指令的定義. PURGE偽操作可同時取消多個宏操作,此時各宏指令之間用逗號隔開.25 宏定義中允許使用宏調用,其限制條件是:必須先定義后調用。例:宏定義: 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宏調用: DIFSQR VAR1,VAR2,VAR326 宏定義體內不僅可

13、以使用宏調用,也可以包含宏定義.宏定義: DEFMAC MACRO MACNAM,OPERATOR MACNAM MACRO X,Y,Z PUSH AX MOV AX,X OPERATOR AX,Y MOV Z,AX POP AX ENDM ENDM 其中MACNAM是內層的宏定義名,但又是外層宏定義的形參,所以調用DEFMAC時,就形成一個宏定義.27宏調用: DEFMAC ADDITION,ADD宏展開: 1 ADDITION MACRO X,Y,Z1 PUSH AX1 MOV AX,X1 ADD AX,Y1 MOV Z,AX1 POP AX1 ENDM形成加法宏定義ADDITION. 同

14、樣,宏調用: DEFMAC SUBTRACT,SUB會形成減法的宏定義. 28 當然在形成這些宏定義后,就可以使用宏調用 ADDITION VAR1,VAR2,VAR3而展開成: 1 PUSH AX 1 MOV AX,VAR1 1 ADD AX,VAR2 1 MOV VAR3,AX 1 POP AX29宏與子程序的區(qū)別處理的時間不同宏調用是在源程序被匯編程序處理的;而子程序調用是在程序執(zhí)行期間由CPU直接執(zhí)行的處理的方式不同兩者都必須先定義后使用,但宏調用是用宏體替換宏調用偽指令,實參代替形參,源程序被翻譯成目標代碼后宏定義隨著消失;而子程序則沒有這樣的替換操作,是以CALL指令將控制權由調用

15、者轉給子程序并執(zhí)行參數(shù)處理不同宏調用是以實參代替形參,參數(shù)的形式不受限制,可以是任何合法的字符;子程序的參數(shù)需要寄存器或存儲單元進行傳遞,而且需要附加的指令實現(xiàn)參數(shù)傳遞30執(zhí)行速度不同子程序調用時需要執(zhí)行CALL指令和RET指令,還要執(zhí)行實現(xiàn)參數(shù)傳遞的附加指令,因而會比宏展開后的代碼多而執(zhí)行速度稍慢占用的存儲器空間大小不同宏指令在每次調用時都要展開,把宏體中的程序段復制一遍,因而用宏指令編寫的程序在目標代碼中會重復出現(xiàn)相同或相似的程序段,占用內存空間較大;而子程序是由CALL指令調用的,無論調多少次,子程序的目標代碼只在程序中出現(xiàn)一次,目標代碼相對較短宏與子程序具有各自的特點,程序員應該根據具

16、體問題選擇使用那種方法通常,當程序段較短或要求較快執(zhí)行時,應選用宏;當程序段較長或為減小目標代碼時,要選用子程序比較結論5.2 重復匯編 有時匯編語言程序需要連續(xù)地重復完全相同的或者幾乎完全相同的一組代碼,這時可使用重復匯編。1.重復偽操作其格式為: REPT 表達式 . (重復塊) ENDM 其中表達式的值用來確定重復塊的重復次數(shù),表達式中如包含外部或未定義的項則匯編指示出錯. 33重復匯編指在匯編過程中,重復展開一段(基本)相同的語句重復匯編沒有名字,不能被調用重復匯編常用在宏定義體中,也可以在一般匯編語句中使用34重復偽操作并不一定要在宏定義體內。例如:X=0 REPT 10 X=X+1

17、 DB X ENDM則匯編后產生1 DB 11 DB 2 DB 3 . DB 1035例:把字符A到Z的ASCII碼填入數(shù)組TABLECHAR=ATABLE LABEL BYTEREPT 26 DB CHAR CHAR=CHAR+1ENDM 1db char;等效于db A 1char = char +1 1db char;等效于db B 1char = char +1. 1db char;等效于db Z 1char = char +1例: 用宏定義及重復偽操作把TAB, TAB+ 1, TAB+2,.,TAB+16的內容存入堆棧.宏定義: PUSH_TAB MACRO K PUSH TAB+

18、K ENDM宏調用: I=0 REPT 17 PUSH_TAB % I I=I+1 ENDM372.不定重復偽操作 (1)IRP偽操作 格式是: IRP 形參, . (重復塊) ENDM匯編程序把重復塊的代碼重復幾次,每次重復把重復塊中的形參用自變量表中的一項來取代,下一次取代下一項,重復次數(shù)由自變量表中的自變量個數(shù)來確定。自變量表必須用尖括號括起,它可以是常數(shù),符號,字符串等。38例: IRP X, DB X ENDM匯編后得: 1 DB 1 1 DB 2 . 1 DB 1039例:IRP REG, PUSH REG ENDM匯編后得: 1 PUSH AX 1 PUSH BX 1 PUSH

19、CX 1 PUSH DX40(2)IRPC偽操作格式是: IRPC 形參,字符串(或) . (重復塊) ENDM IRPC和IRP類似,但自變量表必須是字符串.重復次數(shù)由字符串中的字符個數(shù)確定,每次重復用字符串中的下一個字符取代重復塊中的形參. 41例: IRPC X,0 1 2 3 4 5 6 7 DB X+1 ENDM匯編后得: 1 DB 1 1 DB 2 . 1 DB 842例: IRPC K,A B C D PUSH K&X ENDM匯編后展開形成: 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX 5. 3 條件匯編匯編程序能根據條件把一段源程序包括在匯

20、編語言程序內或者把它排除在外,這時就工用到條件偽操作。條件匯編偽指令在匯編過程中,根據條件決定匯編的語句。格式: IFxx 表達式;滿足,匯編分支語句體1分支語句體1 ELSE;不滿足,匯編分支語句體2分支語句體2 ENDIF;條件匯編結束44 自變量必須在匯編程序第一遍掃后就成為確定的數(shù)值.條件偽操作中的XX表示條件如下: IF expression:匯編程序求出表達式的值,如此值不為0則滿足條件. IFE expression: 如求出表達式的值為0則滿足條件. IFDEF symbol :如符號已在程序中定義,或者已用EXTRN偽操作說明該符號是在外部定義的,則滿足條件. IFNDEF

21、symbol:如符號未定義或未通過EXTRN說明為外部符號則滿足條件.45 IFB : 如自變量為空則滿足條件 IFNB : 如自變量不為空則滿足條件 IFIDN ,:如果字符串和字符串相同,則滿足條件. IFDIF ,:如果字符串和字符串不相同,則滿足條件.上述IF和IFE的表達式中可以使用關系操作符EQ,NE,LT,LE,GT和GE。如:IF 表達式1 EQ 表達式2等。 條件偽操作可以用在宏定義體內,也可以用在宏定義體外,也允許嵌套任意次。46 例:宏指令MAX把三個實參中的最大值放在AX中,而且使實參不同時產生不同的程序段.宏定義: MAX MACRO K,A,B,C LOCAL NE

22、XT,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: ENDM47宏調用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R宏展開: MAX 1,P 1 MOV AX,P 1 ?0001: MAX 2,P,Q 1 MOV AX,P 1 ?0002:CMP Q,AX 1 JLE ?0003 1 MOV AX,Q 1 ?0003: MAX 3,P,Q,R 1 MOV AX,P 1 CMP R,AX 1 JLE ?0004 1 MOV

23、 AX,R 1 ?0004:CMP Q,AX 1 JLE ?0005 1 MOV AX,Q 1 ?0005:48宏定義:PDATA MACRO NUM IF NUM LT 100 ;如果num 100,則匯編如下語句 DB NUM DUP(?) ELSE ;否則,匯編如下語句 DB 100 DUP(?) ENDIF ENDM宏調用: PDATA 12 PDATA 102宏展開: DB 12 DUP(?) DB 100 DUP(?)例:宏指令PDATA根據實參不同時產生不同的程序段.49 例:宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根據不同情況產生無條件轉移

24、指令或比較和條件轉移指令.宏定義: GOTO MACRO L,X,REL,Y IFB JMP L ELSE MOV AX,X CMP AX,Y J&REL L ENDIF ENDM50宏調用: . GOTO LOOP,SUM,NZ,15 . GOTO EXIT .宏展開: . 1 MOV AX,SUM 1 CMP AX,15 1 JNZ LOOP . 1 JMP EXIT51 宏定義可允許遞歸調用,此時條件偽操作可用來結束宏遞歸。 例:宏指令POWER可以用來實現(xiàn)X和2N相乘.這只需對X左移N次可實現(xiàn),可以設COUNT為遞歸次數(shù)的計數(shù)值,當該數(shù)與N相等時即可結束遞歸調用.宏定義: POWER MACRO X,N SAL X,1 COUTN=COUT+1 IF COUNT-N POWER X,N ENDIF ENDM52宏調用: COUTN=0 POWER AX,3宏展開: 1 SAL AX,1 1 SAL AX,1

溫馨提示

  • 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

提交評論