意义:避免了重复编写,使源程序更加简洁、易读。
宏指令:将在源程序中多次使用到同一个程序段定义成一个“指令”
格式:
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
含义:用宏指令名来代替原来的程序段
格式:
1 ;不带参数 2 宏名 3 4 5 ;带参数 6 宏名 实参1,实参2,实参....
含义:宏汇编程序在汇编源程序时自动用宏指令的内容代替宏指令 。
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
例子:
原文:https://www.cnblogs.com/b1ing/p/13068785.html