汇编--学习笔记(十四)-高级汇编技术--宏

 为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。

  • 一、宏汇编
  • 二、重复汇编
  • 三、条件汇编

一、宏汇编

1、宏:源程序中一段具有独立功能的程序代码。
2、宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。

  • 汇编语言程序
    • 指令
    • 伪指令(伪操作)
    • 宏指令

一、宏定义

MACRO_NAME MACRO [亚元表]  ;形参、虚参
       [LOCAL  标号表]
       ...... (宏定义体)
       ......
       ENDM   ;这里没有宏的名字
  • 如果宏定义体有一个或多个标号,则必须用LOCAL伪操作列出所有的标号

二、宏调用

MACRO_NAME [实元表]  ;实参
  • 实元表中实元与亚元表中的亚元在位置上一一对应;
  • 若实元数>大于亚元数,则多余的实元无效;
  • 若实元数<大于亚元数,则多余的亚元作“空(NULL)”处理;
  • 对宏指令的调用必须先定义后调用。

三、宏展开
源程序被汇编时,汇编程序把宏调用展开。
 也就是把宏定义复制到调用宏指令的位置上,同时用实元取代亚元。
 由于LOCAL定义的标号也由??0000~??FFFF替代(因为标号展开后不能重复,所以会自动对标号编号)。

例一:保护寄存器(保护现场)
无参数

宏定义:                      宏展开:
    SAVEREG  MACRO
         PUSH AX              + PUSH AX
         PUSH BX              + PUSH BX
         PUSH CX              + PUSH CX
         PUSH DX              + PUSH DX
         PUSH SI              + PUSH SI
         PUSH DI              + PUSH DI
         ENDM

宏调用:
SAVEREG

例二:两个字相乘(子程序)
有参数

宏定义:                                宏展开:
MULTIPLY MACRO OPR1,OPR2,RESULT 
     PUSH DX                        + PUSH DX
     PUSH AX                        + PUSH AX
     MOV  AX,OPR1                   + PUSH AX,CX
     IMUL OPR2                      + PUSH VAR
     MOV  RESULT,AX                 + PUSH XYZ[BX],AX
     POP  AX                        + POP AX
     POP  DX                        + POP DX
     ENDM

宏调用:
MULTIPLY  CX,VAR,XYZ[BX]

例三、取消宏指令
宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。可以用PURGE取消宏指令。

宏定义:
ADD MARCO OPR1,OPR2,RESULT
    ......
    ......
    ENDM

宏调用:
    ......
    ADD XX,YY,ZZ  ;这里调用的宏定义是自己定义的ADD,自己定义的优先级要高
    PURGE ADD     ;取消宏定义ADD
    .....

例四、求绝对值(使用LOCAL伪操作)
 使用了标号,所以用LOCAL的方式,如上所说用LOCAL列出所有宏定义中出现的标号。

宏定义:                                           宏展开:
ABSOL  MACRO OPER                             + CMP VAR,0
    LOCAL NEXT  ;列出所有标号                   + JGE ??0000
    CMP OPER,0  ;将参赛和0进行比较               + NEG VAR
    JGE NEXT    ;如果参数大于等于0,就转到标号NEXT + ??0000:
    NEG OPER    ;否则就取反
NEXT:   
    ENDM
宏调用:
    ......
    ABSOL VAR         ;这里的展开是??0000:
    ......
    ABSOL BX          ;第二次调用时就是??0001:
    ......

子程序与宏优缺点比较:

  • 子程序
    • 优点:模块化、节省内存,可被多次调用,编程效率高。
    • 缺点:额外开销大(保存返回地址,计算转向地址,传递参数等。),增加了执行时间。适用于子功能代码较长、调用比较频繁的情况。
  • 宏调用
    • 优点:参数传送简单,执行效率高。
    • 缺点:不节省空间,适用于子功能代码较短、传参较多的情况。

二、重复汇编

作用:用于连续产生完全相同或基本相同的一组代码。

一、重复伪操作 REPT

格式:
    REPT 表达式
    ......  ;重复块
    ENDM

例一:REPT
这里是构成了一个循环,DB每次都会形成一个数值。

                         汇编后:
X = 0                   + DB 1 
REPT 10                 + DB 2
X = X + 1               ......
DB X                    + DB 10
ENDM

例二
把字符‘A’到‘Z’的ASCII码填入数值TABLE。

                                 汇编后:
CHAR = 'A'                        + DB 61H
TABLE LABEL BYTE                  + DB 62H
REPT 26                           + DB 63H
DB   CHAR                         + ......
CHART = CHAR+1                    + DB 7AH
ENDM

一、不定重复伪操作 IRP/IRPC

1、IRP格式:
 每次重复时,用自变量表中的一项取代哑元,而重复次数由自变量的个数决定

IRP 哑元,<自变量表>
    ......  ;重复块
ENDM

例一:IRP
这里就如同在循环中,自变量会一个一个的代替哑元。用于保存现场确实好。

                                汇编后:
IRP REG,             + PUSH AX
    PUSH REG                      + PUSH BX
ENDM                              + PUSH CX
                                  + PUSH DX

例二:IRP

                             汇编后:
DATA SEGMENT                DATA SEGMENT
     ARRAY LEBEL BYTE            ARRAY LABEL BYTE
     IRP K,<1,2,3,4>             + DB 'NO.1'
         DB 'NO.&K'              + DB 'NO.2'
     ENDM                        + DB 'NO.3'
DATA ENDS                        + DB 'NO.4'
                            DATA ENDS

2、IRPC格式:
 每次重复用字符串中的一个字符取代哑元,重复次数等于字符串中的字符数

IRPC  哑元,字符串
     ....  ;重复块
ENDM

例:
 在数据段产生字符区ARRAY,包括4个字符串‘NO.K’

                             汇编后:
DATA SEGMENT                DATA SEGMENT
     ARRAY LEBEL BYTE            ARRAY LABEL BYTE
     IRP K,1234                  + DB 'NO.1'
         DB 'NO.&K'              + DB 'NO.2'
     ENDM                        + DB 'NO.3'
DATA ENDS                        + DB 'NO.4'
                            DATA ENDS

IRP和IRPC的区别:

  • 如果是寄存器只能用IRP
  • 如果是字符串两种方法都可以使用

三、条件汇编

作用:根据条件把一段源程序包括在汇编语言程序内,或者排除在外。
一般格式:

IFxx  自变量  ;xx为条件
......       ;自变量满足条件则汇编此块
[ELSE]
......       ;自变量不满足条件则汇编此块
ENDIF

1、IF 表达式
功能:表达式值不为0,表示条件为真。
 如果条件为真,则汇编IF之后直到ENDIF间的程序段,然后继续汇编ENDID之后的部分。
 否则汇编ELSE后的程序段之后跳到ENDIF后继续汇编。

2、IFE 表达式
功能:表达式值为0表示条件为真。其它同上。

3、IF1
功能:汇编处于第一次扫描时条件为真,其它同上。
4、IF2
功能:汇编处于第二次扫描时条件为真,其它同上。

你可能感兴趣的:(asm)