原帖地址:http://blog.csdn.net/liangwei88624/article/details/6213615
一、宏彙編
宏定義是用一組僞操作來實現的。其格式是:
macro_name MACRO [dumny_parameter_list]
... (宏定義體)
ENDM
其中MACRO和ENDM是一對僞操作.這對僞操作之間是宏定義體--是一組獨立功能的程序代碼.宏指令名(macro_name)給出該宏定義的名稱,調用時就使用宏指令名來調用該宏定義.其中啞元表(dumny_parameter_list)給出了該宏定義中所用到的形式參數(或稱虛參),每個啞元之間用逗號隔開.
經宏定義後的宏指令就可以在源程序中調用.這種對宏指令的調用稱爲宏調用,宏調用的格式是:
macro name [actual parameter list]
實元表(actual_parameter_list)中的每一項爲實元,相互之間用逗號隔開.
1.宏定義可以無變元
宏定義:
SAVEREG MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
ENDM
宏調用:
SAVEREG
2.變元可以是操作碼
宏定義:
FOO MACRO P1,P2,P3
MOV AX,P1
P2 P3
ENDM
宏調用:
FOO WORD_VAR,INC,AX
宏展開:
+ MOV AX,WORD_VAR
+ INC AX
3.變元可以是操作碼的一部分,但在宏定義體中必須用&作爲分隔符.
宏定義:
LEAP MACRO COND,LAB
J&COND LAB
ENDM
宏調用:
...
LEAP Z,THERE
...
LEAP NZ,HERE
...
宏展開:
...
+ JZ THERE
...
+ JNZ HERE
...
4.&是一個操作符,它在宏定義體中可以作爲啞元的前綴,展開時可以把&前後個符號合併而形成一個符號,這個符號可以是操作碼,操作數或是一個字符串
宏定義:
PO MACRO P1
JMP TA&P1
ENDM
宏調用:
FO WORD_VAR
宏展開:
+ JMP TAWORD_VAR
5.實元是ASCII串的情況
宏定義:
MSGGEN MACRO LAB,NUM,XYZ
LAB&NUM DB 'HELLO MR.&XYZ'
ENDM
宏調用:
MSGGEN MSG,1,TAYLOR
宏展開:
+ MSG1 DB 'HELLO MR.TAYLOR'
6.宏指令名可以與指令助記符或僞操作名相同,在這種情況下,宏指令的優先級最高,而同名的指令或僞操作就失效了.僞操作PURGE可以用來在適當的時候取消宏定義,以便恢復指令的原始含義.
宏定義:
ADD MACRO OPR1,OPR2,RESULT
...
ENDM
宏調用:
...
ADD XX,YY,ZZ
PURGE ADD
...
在宏調用後,用PURGE僞操作取消定義,以便恢復ADD指令的原始含義,在PURGE ADD後面所用的ADD指令,則服從機器指令的定義.
PURGE僞操作可同時取消多個宏操作,此時各宏指令之間用逗號隔開.
7.LOCAL僞操作的使用.宏定義體內允許使用標號,如:
宏定義:
ABSOL MACRO OPER
CMP OPER,O
JGE NEXT
NEG OPER
NEXT:
ENDM
如果程序中多次調用該宏定義時,展開後會出現標號的多重定義.爲此係統提供了LOCAL僞操作,其格式是
LOCAL list of local labels
其中局部標號表內的各標號之間用逗號隔開.彙編程序對LOCAL僞操作的局部標號表中的每一個局部標號建立唯一的符號(用??0000~??FFFF)以代替在展開中存在的每個局部標號.必須注意,LOCAL僞操作只能用在宏定義體內,而且它必須是MACRO僞操作後的第一個語句,在MACRO和LOCAL僞操作之間還不允許有註釋和分號標誌.
本例中的ABSOL宏定義在考慮有多次調用可能性的情況下,應定義爲:
ABSOL MACRO OPER
LOCAL NEXT
CMP OPER,0
JGE NEXT
NEG OPER
NEXT:
ENDM
宏調用:
...
ABSOL VAR
...
ABSOL BX
...
宏展開:
...
+ CMP VAR,0
+ JGE ??0000
+ NEG VAR
+??0000:
...
+ CMP BX,0
+ JGE ??0001
+ NEG BX
+??0001:
...
8.宏定義中允許使用宏調用,其限制條件是:必須先定義後調用
宏定義:
DIF MACRO X,Y
MOV AX,X
SUB AX,Y
ENDM
DIFSQR MACRO OPR1,OPR2,RESULT
PUSH DX
PUSH AX
DIF OPR1,OPR2
IMUL AX
MOV RESULT,AX
POP AX
POP DX
ENDM
宏調用:
DIFSQR VAR1,VAR2,VAR3
9.宏定義體內不僅可以使用宏調用,也可以包含宏定義.
宏定義:
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時,就形成一個宏定義.
宏調用:
DEFMAC ADDITION,ADD
宏展開:
+ ADDITION MACRO X,Y,Z
PUSH AX
MOV AX,X
ADD AX,Y
MOV Z,AX
POP AX
ENDM
形成加法宏定義ADDITION.同樣,宏調用
DEFMAC SUBTRACT,SUB
形成減法的宏定義.當然在形成這些宏定義後,就可以使用宏調用
ADDITION VAR1,VAR2,VAR3
而展開成:
+ PUSH AX
+ MOV AX,VAR1
+ ADD AX,VAR2
+ MOV VAR3,AX
+ POP AX
10.這裏再介紹一個宏定義的變元中使用的僞操作%,它的格式是:
%expression
彙編程序把跟在%之後的表達式的值轉換成當前基數下的數,在展開期間,用這個數來取代啞元.
宏定義:
MSG MACRO COUNT,STRING
MSG&COUNT DB STRING
ENDM
ERRMSG MACRO TEXT
CNTR=CNTR+1
MSG % CNTR,TEXT
ENDM
宏調用:
...
CNTR=0
ERRMSG 'SYNTAX ERROR'
...
ERRMSG 'INVALID OPERAND'
...
宏展開:
...
+ MSG1 DB 'SYNTAX ERROR'
...
+ MSG2 DB 'INVALID OPERAND'