宏匯編

發(fā)布時間:2024-07-08
宏( macro )是具有宏名的一段匯編語句序列(宏定義時書寫),是匯編語言的一個特點,它是與子程序類似又獨具特色的另一種簡化源程序的方法
宏指令——這段匯編語句序列的縮寫(宏調(diào)用時書寫)
宏展開——宏指令處用這段宏代替的過程(宏匯編時實現(xiàn))
宏的參數(shù)功能強(qiáng)大,頗具特色
配合宏,還有宏操作符和有關(guān)偽指令
宏( macro )是源程序中一段有獨立功能的程序代碼。它只需在源程序中定義一次,就可以多次調(diào)用它,調(diào)用時只需用一個宏指令語句就可以了。
宏定義是用一組偽操作來實現(xiàn)的.其格式是:
宏名 macro [ 形參表 ]
…宏定義體
endm
其中 macro 和 endm 是一對偽操作,這對偽操作之間是宏定義體(一組有獨立功能的程序代碼).宏名給該宏定義的名稱,調(diào)用時就使用宏名來調(diào)用該宏定義,宏指令名給出該宏定義的名字,調(diào)用時就是用宏指令名來調(diào)用宏定義。
例如 :
宏名的第一個符號必須是字母,其后可以跟字母、數(shù)字和下劃線字符。
mainbeging macro ;; 定義名為 mainbegin 的宏,無參數(shù)
mov ax,@data ;; 宏定義體
mov ds,ax
endm ;; 宏定義結(jié)束
mainend macro retnum ;; 帶有形參 retnum
mov al,retnum ;; 宏定義中使用參數(shù)
mov ah,4ch
int 21h
endm
multiply macro opr1,opr2,result
;; 定義名具有三個參數(shù)的宏
push dx ;; 宏定義體
push ax
mov ax,opr1
imul opr2
mov result,ax
pop ax
pop dx
endm ;; 宏定義結(jié)束
宏名 [ 實參表 ]
宏調(diào)用
經(jīng)宏定義定義后的宏指令可以在源程序中調(diào)用,這種對宏指令的調(diào)用稱為宏調(diào)用。其格式為:宏名 [ 實參表 ]
宏調(diào)用的實質(zhì)是在匯編過程中進(jìn)行宏展開,宏展開就是用宏定義體取代源程序的宏指令名。
例:
start: mainbegin ; 宏調(diào)用,建立 ds 內(nèi)容
multiply 240,bx,save
; 宏調(diào)用,顯示字符串
mainend 0 ; 宏調(diào)用,返回 dos
end start
宏展開
在匯編時,用宏定義體的代碼序列取代源程序中的宏指令名,而且用實際參數(shù)取代形式參數(shù)的過程。
宏展開的具體過程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時,即用相應(yīng)的宏定義體取代源程序的宏指令,同時用位置匹配的實參對形參進(jìn)行取代,而且在取代時,實參與形參是一一對應(yīng)的。
start:
1 mov ax,@data ; 宏指令 mainbegin 的宏展開
1 mov ds,ax
1 push dx ; 宏指令 multiply 的宏展開
1 push ax
1 mov ax,opr1
1 imul opr2
1 mov result,ax
1 pop ax
1 pop dx
1 mov al ,0
;宏指令 mainend 0 的宏展開
1 mov ah,4ch
1 int 21h
end start
宏的參數(shù) :
宏的參數(shù)使用非常靈活
宏定義時,可以無參數(shù),例如 :mainbegin ,也可以帶有一個參數(shù),例如 :mainend ,還可以具有多個參數(shù);例如 :multiply
參數(shù)可以是常數(shù)、變量、存儲單元、指令(操作碼)或它們的一部分,也可以是表達(dá)式;
宏定義體可以是任何合法的匯編語句,既可以是硬指令序列,又可以是偽指令序列;
例:
;宏定義
shlext macro shloprand,shlnum
push cx
mov cl,shlnum
shl shloprand cl
pop cx
endm
;宏指令
shlext ax,6
;宏展開
1 push cx
1 mov cl,06
1 shl ax,cl
1 pop cx
;統(tǒng)一 4 條移位指令的宏指令 (shl,shr,sal,sar)
shift macro soprand,snum,sopcode
push cx
mov cl,snum
s&sopcode& soprand,cl
pop cx
endm
例:宏調(diào)用:  shift ax,4,ar
宏展開:
1 push cx
1 mov cl,4
1 sar ax,cl
1 pop cx
參數(shù)可以是操作碼的一部分,但在宏定義體中必須用 & 作為分隔符。 & 是一個操作符,它在宏體中可作為形參的前綴,展開時把 & 前后兩個符號合并形成一個符號,這個符號可是操作碼、操作數(shù)和一個字符串。
;統(tǒng)一移位和循環(huán)移位 8 條指令的宏指令
shrot macro sroprand,srnum,sropcode
push cx
mov cl,srnum
sropcode sroprand,cl
pop cx
endm
例:
宏調(diào)用: shrot ax,4,rcl
宏展開:
1 push cx
1 mov cl,4
1 rcl ax,cl
1 pop cx
例:
;宏定義
dstring macro string
db '&string&',0dh,0ah,'$'
endm
;宏調(diào)用
dstring < this is a example. >
dstring < 0 !< number !< 10 >
;宏展開
1 db 'this is a example.', 0dh,0ah,'$'
1 db '0 < number < 10' , 0dh,0ah, '$'
宏操作符
;; ——宏注釋符,用于表示在宏定義中的注釋。采用這個符號的注釋,在宏展開時不出現(xiàn)
& ——替換操作符,用于將參數(shù)與其他字符分開。如果參數(shù)緊接在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該偽操作符
宏操作符
< > ——字符串傳遞操作符,用于括起字符串。在宏調(diào)用中,如果傳遞的字符串實參數(shù)含有逗號、空格等間隔符號,則必須用這對操作符,以保證字符串的完整
! ——轉(zhuǎn)義操作符 ! ,用于指示其后的一個字符作為一般字符,不含特殊意義
% ——表達(dá)式操作符,用在宏調(diào)用中,表示將后跟的一個表達(dá)式的值轉(zhuǎn)換成當(dāng)前基數(shù)下的數(shù) ( 默認(rèn)為 10 進(jìn)制 ) 作為實參,而不是將表達(dá)式本身作為參數(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 opperand'
宏展開:
cntr=0
1 cntr=cntr+1
1 msg %cntr, ‘syntax error'
2 msg1 db ‘syntaxerror'
1 cntr=cntr+1
1 msg %cntr,'invalid opperand'
2 msg2 db ‘invalid opperand'
注意:
在程序中,宏定義必須出現(xiàn)在紅調(diào)用以前,也就是說必須先定義后調(diào)用,因此,常常把宏定義放在所有程序段代碼以前,即在程序已開始先列出程序中所用的所有的宏定義。
與宏有關(guān)的偽指令
局部標(biāo)號偽指令
例:
;宏定義
absol macro oprd
local next
cmp oprd,0
jge next
neg oprd
next:
endm
如果程序中多次調(diào)用,展開后會出現(xiàn)標(biāo)號的多重定義,這是不能允許的,為此提供了 lacol 偽操作。
格式: local 標(biāo)號列表 ( 各標(biāo)號之間用逗號分隔 )
宏定義體采用了標(biāo)號,應(yīng)使用 local 加以說明,它必須是宏定義 macro 語句之后的第一條語句, local 偽操作只能用在宏定義體內(nèi),而且它必須是 macro 偽操作后的第一個語句,在 local 和 macro 偽操作之間還不允許有注釋和分號標(biāo)志,匯編程序?qū)?local 偽指令的局部標(biāo)號表中每個局部標(biāo)號建立惟一的符號 ( 用 0000-ffff) 以代替在展開中存在的每一個局部標(biāo)號。
所以上面的例子還可以定義成:
absol macro oper
local next
cmp oper,0
jge next
neg oper
next:
endm
;宏調(diào)用
………
absol word ptr [bx]
……….
absol bx
……….
;宏展開
1 cmp word ptr [bx],0
1 jge 0000
1 neg word ptr [bx]
1 0000:
1 cmp bx,0
1 jge 0001
1 neg bx
1 0001:
宏定義刪除偽指令
格式: purge 宏名表
為了刪除匯編時引入到內(nèi)存的無用的宏定義,可以用 purge 偽指令把它刪除。在程序中也可以使用 purge 偽操作來刪除一個不使用的宏定義,刪除宏定義的含義是使該宏定義為空,程序中如果出現(xiàn)了一個已經(jīng)刪除的宏定義的宏調(diào)用,匯編程序不會指示出錯,但它將忽略該宏調(diào)用,當(dāng)然也不會予以展開。
宏定義退出偽指令
格式: exitm
偽指令 exitm 表示結(jié)束當(dāng)前宏調(diào)用的展開
宏指令名可以與指令助記符或偽操作名相同 , 在這種情況下 , 宏指令的優(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ī)器指令的定義 .
purge 偽操作可同時取消多個宏操作 , 此時各宏指令之間用逗號隔開 .
宏定義中允許使用宏調(diào)用 , 其限制條件是 : 必須先定義后調(diào)用。
例 : 宏定義 :
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
宏調(diào)用 :
difsqr var1, var2 , var3
宏定義體內(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
endm
endm
其中 macnam 是內(nèi)層的宏定義名 , 但又是外層宏定義的形參 , 所以調(diào)用 defmac 時 , 就形成一個宏定義 .
宏調(diào)用 :
defmac addition,add
宏展開 :
1 addition macro x,y,z
1 push ax
1 mov ax,x
1 add ax,y
1 mov z,ax
1 pop ax
1 endm
形成加法宏定義 addition.
同樣 , 宏調(diào)用 :
defmac subtract,sub
會形成減法的宏定義 .
當(dāng)然在形成這些宏定義后 , 就可以使用宏調(diào)用
addition var1,var2,var3
而展開成 :
1 push ax
1 mov ax,var1
1 add ax,var2
1 mov var3,ax
1 pop ax
上一個:零售橡塑保溫板生產(chǎn)廠家
下一個:地下水質(zhì)檢測簡化了傳統(tǒng)儀器的操作步驟

什么是防火涂料、防火涂料的原理、性能?
攀緣植物會損壞墻面和孳生蚊蟲嗎?
百度云服務(wù)器雙十一
RTT02R250FTH現(xiàn)貨庫存,最新價格
超聲波細(xì)胞粉碎機(jī)在生物醫(yī)學(xué)研究中的應(yīng)用
ZP-100CIVB推車式電腦技術(shù)參數(shù)
65mn無縫管的熱處理淬火全過程
鶴頂蘭
吊頂施工質(zhì)量通病及防治要點有哪些?
ssd硬盤品牌排行榜天梯圖最新,固態(tài)硬盤什么牌子好
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos