汇编语言——宏汇编与重复汇编和条件汇编

宏汇编

意义:避免了重复编写,使源程序更加简洁、易读。

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

例子:

 

 

 

posted @ 2020-06-08 21:50  b1ing丶  阅读(2116)  评论(0编辑  收藏  举报