第七章 高級匯編語言技術_第1頁
已閱讀1頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

提交評論