




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第7章高級匯編語言技術7.1宏匯編7.2重復匯編7.3條件匯編1. 宏匯編宏:源程序中一段有獨立功能的程序代碼。在源程序中定義一次,就可以多次調用它,調用時只需要一個宏指令語句。宏指令:用戶自定義的指令。在編程時,將多次 使用的功能用一條宏指令來代替。 匯編語言程序指令偽指令(偽操作)宏指令7.1.1宏定義、宏調用和宏展開2、宏定義: macro_name MACRO 啞元表 ; 形參/虛參 LOCAL 標號表 ; 宏定義體 ENDM宏定義名的第一個符號必須是字母,其后可以跟字母、數(shù)字或下劃線字符。 啞元表給出了宏定義中所用到的形式參數(shù)(或稱虛參),每個啞元之間用逗號隔開。4、宏展開:匯編程序
2、把宏調用展開宏展開就是用宏定義體取代源程序中的宏指令,而且用實元取代宏定義中的啞元。取代時實元和啞元應該一一對應,即第一個實元取代第一個啞元,第二個實元取代第二個啞元依次類推 。一般說來,實元的個數(shù)和啞元的個數(shù)相等,但匯編程序并不要求它們必須相等。若實元個數(shù)大于啞元個數(shù),則多余的實元不予考慮;若實元個數(shù)小于啞元個數(shù),則多余的啞元作“空”處理。注意:宏展開后,即用實元取代啞元后,所得到的語句應該是有效的,即匯編語法應是正確的,否則匯編程序將會指示出錯。 3、宏調用: (必須先定義后調用) macro_name 實元表 ; 實參實元表中的每一項為實元,相互之間用逗號隔開。 優(yōu):模塊化 省內存缺:開
3、銷大宏定義:Q macro x,y endm主程序:Q a, bQ c, dQ e, f目標程序:優(yōu):參數(shù)傳送簡單,執(zhí)行效率高缺:占用內存空間大主程序:CALL -CALL -CALL -子程序: RET5. 宏與子程序的區(qū)別例:兩個字相乘宏定義:multiply MACRO opr1,opr2,result push dx push ax mov ax,opr1 imul opr2 mov result,ax pop ax pop dx ENDM宏調用:multiply cx,var,xyzbx宏展開:1 push dx1 push ax1 mov ax,cx1 imul var1 mov
4、xyzbx,ax1 pop ax1 pop dx例:保存寄存器宏展開:1 push ax1 push bx1 push cx1 push dx1 push si1 push di宏定義:savereg MACRO push ax push bx push cx push dx push si push di ENDM宏調用:savereg6、宏定義中的參數(shù)(1)宏定義中可以無變元(2)變元可以是操作碼例:宏定義:FOOMACRO P1,P2,P3MOV AX,P1P2P3ENDM宏調用:FOO WORD_VAR,INC,AX宏展開:1MOV AX,WORD_VAR1INC AX(3)變元可以是
5、操作碼的一部分,但在宏定義體中必須用&作為分隔符。例:宏定義:LEAPMACRO COND,LABJ&COND LABENDM宏調用:LEAP Z,THERELEAP NZ,HERE宏展開:1JZ THERE1JNZ HERE(3)變元可以是操作碼的一部分,但在宏定義體中必須用&作為分隔符。例:宏定義:LEAPMACRO COND,LABJ&COND LABENDM宏調用:LEAP Z,THERELEAP NZ,HERE宏展開:1JZ THERE1JNZ HERE 說明:&是一個操作符,它在宏定義中可以作為啞元素的前綴,展開時可以把&前后兩個符號合并而形成一個符號,這個符號可以是操作碼、操作數(shù)
6、或是一個字符串。例:FOMACROP1JMPTA&P1ENDM宏調用:FOWORD_VAR宏展開:1JMPTAWORD_VAR如果宏定義為:FOMACROP1JMPTAP1ENDM 則在展開時,匯編程序把TAP1看做是一個獨立的標號,并不把TAP1中的P1作為啞元看待。例:變元是ASCII串宏定義:MSGGENMACRO LAB,NUM,XYZLAB&NUMDBHELLO MR.&XZYENDM宏調用:MSGGENMSG,1,TAYLOR宏展開:1MSG1DB HELLO MR.TAYLOR(4)變元中使用%操作符的情況,格式為 %expression。匯編程序把跟在%之后的表達式的值轉換成當
7、前基數(shù)下的數(shù),在展開時,用這個數(shù)來取代啞元。宏定義:MSGMACRO COUNT,STRINGMSG&COUNTDB STRINGENDMERRMSGMACROTEXTCNTR=CNTR+1MSG%CNTR,TEXTENDM宏調用: CNTR=0 ERRMSGSYNTAX ERROR ERRMSG INVALID OPERAND宏展開:2MSG1DB SYNTAX ERROR 2 MSG2DB INVALID OPERAND實際展開分兩層:CNTR=0CNTR=CNTR+11MSG%CNTR,SYNTAX ERROR 2MSG1DB SYNTAX ERROR 1CNTR=CNTR+11MSG%
8、CNTR,INVALID OPERAND2MSG2DBINVALID OPERAND(5)LOCAL偽操作:宏定義:ABSOLMACROOPERCMPOPER,0JGENEXTNEGOPERNEXT:ENDM如果程序中多次調用該宏時,則展開后會出現(xiàn)標號的多重定義,這是不能允許,這時可以使用LOCAL偽操作。其格式為:LOCAL list of local labels:其中局部標號表內的各標號之間用逗號隔開。匯編程序對LOCAL偽操作的局部標號表中的每一個局部標號建立唯一的符號。(用?0000?FFFF)代替在展開中存在的每個局部標號。注意:LOCAL偽操作只能用在宏定義體內,而且它必須是MA
9、CRO偽操作后的第一個語句,在MACRO和LOCAL偽操作之間還不允許有注釋和分號標志。ABSOLMACROOPERLOCAL NEXTCMPOPER,0JGENEXTNEGOPERNEXT:ENDM因此上例可以改為如下:ABSOLMACROOPERLOCAL NEXTCMPOPER,0JGENEXTNEGOPERNEXT:ENDM宏調用:ABSOL VARABSOL BX則宏展開后為:則宏展開后為:1CMPVAR,01JGE?00001NEGVAR1 ?0000:1CMP BX,01JGE ?00011NEG BX1 ?0001:如果宏定義體內的標號數(shù)多于一個,則可以把他們列在LOCAL偽操
10、作之后,如LOCAL NEXT,OUT,EXIT宏展開時用?0000取代NEXT,?0001取代OUT, ?0002取代EXIT。第二次調用用?0003取代NEXT,?0004取代OUT, ?0005取代EXIT。(6)在宏定義內使用宏:宏定義內允許使用宏調用,其限制條件是:必須先定義后調用。宏定義:DIFMACROX,YMOVAX,XSUBAX,YENDMDIFSQRMACROOPER1,OPER2,RESULTPUSH DXPUSH AXDIF OPER1,OPER2IMUL AXMOV RESULT,AXPOP AXPOP DXENDM宏調用:DIFSQRVAR1,VAR2,VAR3宏展
11、開:1PUSH DX1PUSH AX2MOVAX,VAR12SUBAX,VAR21IMUL AX1MOV VAR3,AX1POP AX1POP DX例宏定義:INT21MACROFUNCTNMOVAH,FUNCTNINT 21HENDMDISPMACROCHARMOV DL,CHARINT2102HENDM宏調用:DISP ?宏展開:1 MOV DL,?2 MOVAH,02h2 INT 21H(6)在宏定義內包含宏定義:宏定義:DEFMACMACROMACNAM,OPERATORMACNAMMACRO X,Y,ZPUSH AXMOV AX,XOPERATOR AX,YMOV Z,AXPOP A
12、XENDMENDM其中MACNAM是內層的宏定義名,又是外層宏定義的啞元。因此調用DEFMAC時,就形成一個宏定義。宏調用:DEFMACADDITION,ADD形成加法宏定義:ADDITION MACRO X,Y,ZPUSH AXMOV AX,XADD AX,YMOV Z,AXPOP AXENDM同樣,宏調用DEFMACSUBTRACT,SUB可形成減法宏定義。DEFMAC LOGOR,OR可形成邏輯或宏定義。(7)宏庫的建立:當程序中定義多個宏或自己程序中常用的宏定義建立一個獨立的文件,這個只包含若干個宏定義的文件可稱為宏庫通常的擴展名為MAC或INC來表示。在應用程序中需要用到宏庫中的宏定
13、義時,只需要在程序的開始用下列語句,INCLUDE C:MACRO.MAC你們匯編程序將把宏庫中的所有的宏定義都包含在應用程序中。7.2重復匯編用于連續(xù)產生完全相同或基本相同的一組代碼。1、重復偽操作 REPTREPT 表達式 ;重復塊ENDM其中表達式的值用來確定重復的次數(shù),表達式如果包含外部或未定義的項則匯編出錯。例:X=0REPT 10X=X+1DBXENDM則匯編后產生1DB 11DB 21DB 10例:把字符A到Z的ASCII碼填入數(shù)組TABLE。CHAR=ATABLELABLE BYTEREPT 26DBCHARCHAR=CHAR+1ENDM經匯編產生:1DB 41H1DB 42H
14、1DB 5AH例:用宏定義及重復偽操作把TAB,TAB+2,TAB+4,TAB+8的內容存入堆棧。宏定義:PUSH_TABMACRO KPUSH TAB+KENDM宏調用:I=0REPT5PUSH_TAB %II=I+2ENDM宏展開宏展開2PUSH TAB+02PUSH TAB+22PUSH TAB+42PUSH TAB+62PUSH TAB+8例:要求建立一個8字的數(shù)組,其中每個字的內容是下一字的地址,而最后一個字的內容是第一個字的地址。ARRAYLABLE WORDREPT 7DW $+2ENDMDWARRAY經匯編后得:1DW$+21DW$+21DW$+2DW ARRAY2、不定重復偽
15、操作:(1)IRP格式:IRP 啞元, ;重復塊ENDM說明:匯編程序把重復塊的代碼重復幾次,每次重復把重復塊中的啞元用自變量表中的一項來取代,下一次取代下一項,重復次數(shù)由自變量表中的自變量個數(shù)確定。自變量表必須用尖括號括起來,它可以是常數(shù)、符號和字符串。例:IRP X,DBXENDM匯編后得:則匯編后產生1DB 11DB 21DB 10IRP REG, PUSH REGENDM匯編后:1 PUSH AX1 PUSH BX1 PUSH CX1 PUSH DX(2)IRPC偽操作IRPC 啞元,字符串 ;重復塊ENDMIRPC自變量必須是字符串。重復次數(shù)由字符串中的字符個數(shù)確定,每次重復用字符串
16、中的下一個字符取代重復塊中的啞元。例:array label byteIRPC K, 12345db NO.&KENDM1 db NO.11 db NO.21 db NO.31 db NO.41 db NO.5例:IRPC X, 01234567db X+1ENDM1 db 11 db 21 db 31 db 41 db 5例:IRPC K, ABCDPUSH K&XENDM1 PUSH AX1 PUSH BX1 PUSH CX1 PUSH DX7.3條件匯編根據(jù)條件把一段源程序包括在匯編語言程序內或者排除在外。一般格式:IF ; 為條件 ; 自變量滿足條件則匯編此塊ELSE ; 自變量不滿足
17、條件則匯編此塊ENDIFIF 表達式 ;表達式0,則匯編IFE 表達式 ;表達式0,則匯編IF1 ;在第一遍掃視期間滿足條件IF2 ;在第二遍掃視期間滿足條件IFDEF 符號 ;符號已定義,則匯編IFNDEF 符號 ;符號未定義,則匯編IFB ;自變量為空,則匯編IFNB ;自變量不為空,則匯編IFIDN , ;串1與串2相同IFDIF , ;串1與串2不同例:求最大值放入AX宏定義: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 ENDIFNEXT: CMP B, AX
18、 JLE OUT MOV AX, B ENDIFOUT: ENDM1 MOV AX, P1 ?0002: CMP Q, AX1 JLE ?00031 MOV AX, Q1 ?0003:宏展開:1 MOV AX, P1 ?0001: 1 MOV AX, P1 CMP R, AX1 JLE ?00041 MOV AX, R1 ?0004: CMP Q, AX1 JLE ?00051 MOV AX, Q1 ?0005:宏調用:MAX 1, PMAX 2, P, QMAX 3, P, Q, R例:宏指令BRANCH產生一條轉向X的轉移指令。當它相對于X的距離小于128字節(jié)時產生JMP SHORT X;
19、否則產生JMP NEAR PTR X(X必須位于該轉移指令后)BRANCHMACRO XIF ($-X) LT 128JMP SHORT XELSEJMP NEAR PTR XENDIFENDM宏調用:BRANCH AA宏展開:1JMP SHORT AA否則產生1JMPNEAR NEAR PTR AA(1) 宏定義的遞歸調用例:POWER實現(xiàn) ( X * 2N ); 宏展開1 SAL AX, 12 SAL AX, 13 SAL AX, 1 宏定義POWER MACRO X, N SAL X, 1CNT=CNT+1 IF CNT-N POWER X, N ENDIF ENDM; 宏調用CNT=0 POWER AX, 3(1) IFNDEF的使用 mov ax, dividend mov bx, divisor sub cx, cxcomp: cmp ax, bx jb out sub ax, bx inc cx jmp compout: mov quotient, cx endmdivide macro dividend,divisor,quotient local comp, out cnt=0 ifndef divid
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 賣場承包經營合同
- 企業(yè)公司房屋租賃合同
- 公廁給排水施工方案
- bef增光膜施工方案
- 實驗室咨詢服務合同
- TACCEM 135-2024 雙組份聚氨酯導熱結構膠
- 與石油管道交叉施工方案
- 建筑工程機械租賃合同范文
- 昌河中學高一數(shù)學試卷
- 水泥樓梯改造施工方案
- 2025年孝感貨運從業(yè)資格考試
- 防災避險安全應急知識培訓課件
- 2023年新高考全國Ⅱ卷語文真題(解析版)
- 2025年政府采購評審專家理論考試復習試指導題庫(含答案)
- 2025屆西北四省(山西、陜西、青海、寧夏)高三下學期第一次聯(lián)考英語試題
- 2025年湖南鐵道職業(yè)技術學院單招職業(yè)技能測試題庫1套
- 高中主題班會 復盤-在思考中學習課件-高中上學期主題班會
- 2.2學會管理情緒 課件 -2024-2025學年統(tǒng)編版道德與法治七年級下冊
- 2024-2025學年第二學期教學教研工作安排表 第二版
- 江蘇省中小學生金鑰匙科技競賽(高中組)考試題及答案
- 2024版質量管理培訓
評論
0/150
提交評論