宏匯編
意義:避免了重復編寫,使源程序更加簡潔、易讀。
1.宏定義
宏指令:將在源程序中多次使用到同一個程序段定義成一個“指令”
格式:
1 ;無參數 2 宏名 macro 3 4 宏體 5 6 endm 7 8 ;有參數 9 宏名 macro 形參1,形參2,形參... 10 11 宏體 12 13 endm
例子:
1 ;將兩個內存單元的內容相互交換 2 exchange macro mem1,mem2,reg 3 mov reg,mem1 4 xchg reg,mem2 ;xchg為交換指令,用於兩個寄存器,寄存器和內存之間的內容的交換 5 mov mem1,reg 6 endm
2.宏調用
含義:用宏指令名來代替原來的程序段
格式:
1 ;不帶參數 2 宏名 3 4 5 ;帶參數 6 宏名 實參1,實參2,實參....
3.宏展開
含義:宏匯編程序在匯編源程序時自動用宏指令的內容代替宏指令 。
1 ;宏定義 2 push4 macro 3 push ax 4 push bx 5 push cx 6 push dx 7 endm 8 9 exchange macro mem1,mem2,reg 10 mov reg,mem1 11 xchg reg,mem2 12 mov mem1,reg 13 endm; 設置數據段 14 15 data segment 16 da_w01 dw 1234h 17 da_w02 dw 5678h 18 data ends; 設置堆棧段 19 20 stack1 segment stack 21 dw 20h dup(?) 22 stack1 ends 23 24 ;設置代碼段 25 coseg segment 26 assume cs:coseg,ds:data,ss:stack1 27 start:mov ax,data 28 mov ds,ax 29 ┇ 30 push4 31 ;宏指令語句 32 + push ax 33 + push bx 34 + push cx 35 + push dx 36 ┇ 37 exchange da_w01,da_w02,cx ;宏指令語句 38 + mov cx, da_w01 39 + xchg cx, da_w02 40 + mov da_w01,cx 41 ┇ 42 coseg ends 43 end start
連接操作符&
含義:宏展開時,對應形參的實參就與它前后的符號連接在一起
用途:修改某些符號
例子:
shift_var marco r_m,direct,count mov cl,count s&direct r_m,cl endm
shift_var ax,hl,2的宏展開為: + mov cl,2 + shl ax,cl
表達式操作符%
含義:告訴宏匯編程序獲取表達式的值,而不是獲取表達式文本本身
格式:%表達式
注意:這個操作符一般是出現在宏調用中,不允許出現在形參的前面
;宏定義 shif0 macro cnt mov cl,cnt endm shif1 macro reg,direct,count shif0 %count s&direct reg,cl endm ;宏調用 shif1 ax,hl,2 shif1 bl,ar,3 ;宏展開 shif1 ax,hl,2 + mov cl,2 + shl ax,cl shif1 bl,ar,3 + mov cl,3 + sar bl,cl
文本操作符<>
含義:把一個完整的實參括起來,作為一個單一的實參
注意:文本操作符還可以用來處理某些特殊的字符:如“;”和“&”。
exchange <byte ptr da_word1>,<byte ptr da_word2>,al 宏展開時,替換的三條指令是: mov al,byte ptr da_word1 xchg al,byte ptr da_word2 mov byte ptr word1,al endm
字符操作符!
含義:“!”后的字符不作特別的操作符使用,而是以字符本身的意義進行處理。
如: “!&”表示&不作連接操作符用,只作符號&使用。“!%”表示%不作表達式操作符使用,只作百分號用。
prompt macro num,text promp&num db '&text&' endm assume cs:code,ds:data data segment prompt 23,<expression !> 255> data ends code segment start: mov ax,data mov ds,ax mov ax,4c00h int 21h code ends end start ;test_p.asm
宏解釋符
含義:說明后面的文本是注解
注意:宏注解符;;僅出現在宏定義中。
例子:
prompt macro num,text promp&num db ‘&text&’ ;; prompt宏的定義 endm assume cs:code,ds:data data segment prompt 23,<expression !> 255> data ends code segment start: mov ax,data mov ds,ax mov ax,4c00h int 21h code ends end start ;test_p.asm
local偽指令
意義:在宏定義中使用變量名和標號,為了避免在宏展開時產生多個相同的變量名或標號。
格式:local <符號表>
注意:宏展開時,local偽指令指定的變量、標號自動生成格式為“??XXXX”的符號,其中后四位順序使用0000~FFFF的十六進制數字。
delay macro reg ;; reg為16位寄存器 local lop push cx mov cx,reg lop: nop loop lop pop cx endm assume cs:code code segment start: mov ax,5000 delay ax mov ax,1000 delay ax mov bx,2000 delay bx mov ax,4c00h int 21h code ends end start
宏嵌套
1.宏定義嵌套
含義:一個宏定義中包含另一個宏定義。
應用:常常用這種宏定義嵌套來產生一些新的宏定義
jump macro cond ;;外層宏定義 J&cond&s macro dest ;;內層宏定義 local next,exit J&cond next jmp exit next: jmp dest exit: endm endm assume cs:code code segment start: mov ax,5 cmp ax,5 jump e ;;調用外層宏,生成內層宏定義 jes disp ;;調用內層宏,實現功能 jmp finish db 256 dup(0) disp: mov ax,0b800h mov es,ax mov al,'Y’ mov es:[12*160+40*2],al finish: mov ax,4c00h int 21h code ends end start ;利用嵌套宏定義,實現長條件轉移。
2.宏定義內嵌套宏調用
含義:在一個宏定義的宏體內有宏調用
注意:被調用的宏指令必須是已定義的
delay_s macro reg local lop push cx mov cx,reg lop: nop loop lop pop cx endm delay_m macro reg local s push cx mov cx,reg s: delay_s reg loop s pop cx endm assume cs:code code segment start: mov ax,500 delay_m ax mov ax,4c00h int 21h code ends end start
宏定義與子程序的區別
相同點:(1)簡化源程序的書寫。 (2)節省編程工作量。 不同點: (1)宏指令並不節省目標程序,子程序節省目標代碼和存儲空間 (2)宏指令的功能靈活,執行速度快;子程序的靈活性差些,執行 速度也不如宏指令快
重復匯編
rept偽指令
含義:將重復語句序列重復匯編,表達式的值為重復匯編的次數
格式:
rept 表達式
重復語句序列
endm
例子:
irp偽指令
含義:將重復語句序列重復匯編,次數由實參的個數決定。
格式:
irp 形參,<實參1,實參2,...>
重復語句序列
endm
例子:
條件匯編
含義:匯編程序根據條件的不同匯編不同的程序段。
格式:
if xx 表達式
條件語句塊
else
條件語句塊
endif
例子: