安防监控知识
电气知识|宏汇编
2016-05-26  浏览:52
安防之家讯:宏( Macro )是具有宏名的一段汇编语句序列(宏定义时书写),是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法

宏指令——这段汇编语句序列的缩写(宏调用时书写)

宏展开——宏指令处用这段宏代替的过程(宏汇编时实现)

宏的参数功能强大,颇具特色

配合宏,还有宏操作符和有关伪指令

宏( Macro )是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次,就可以多次调用它,调用时只需用一个宏指令语句就可以了。

宏定义是用一组伪操作来实现的.其格式是:

宏名 macro [ 形参表 ]

…宏定义体

endm

其中 macro 和 endm 是一对伪操作,这对伪操作之间是宏定义体(一组有独立功能的程序代码).宏名给该宏定义的名称,调用时就使用宏名来调用该宏定义,宏指令名给出该宏定义的名字,调用时就是用宏指令名来调用宏定义。

例如 :

宏名的第一个符号必须是字母,其后可以跟字母、数字和下划线字符。

MAINBEGING MACRO ;; 定义名为 MAINBEGIN 的宏,无参数

MOV AX,@DATA ;; 宏定义体

MOV DS,AX

ENDM ;; 宏定义结束

MAINEND MACRO RETNUM ;; 带有形参 RETNUM

MOV AL,RETNUM ;; 宏定义中使用参数

MOV AH,4CH

INT 21H

ENDM

MULTIPLY MACRO OPR1,OPR2,RESULT

;; 定义名具有三个参数的宏

PUSH DX ;; 宏定义体

PUSH AX

MOV AX,OPR1

IMUL OPR2

MOV RESULT,AX

POP AX

POP DX

ENDM ;; 宏定义结束

宏名 [ 实参表 ]

宏调用

经宏定义定义后的宏指令可以在源程序中调用,这种对宏指令的调用称为宏调用。其格式为:宏名 [ 实参表 ]

宏调用的实质是在汇编过程中进行宏展开,宏展开就是用宏定义体取代源程序的宏指令名。

例:

START: MAINBEGIN ; 宏调用,建立 DS 内容

MULTIPLY 240,BX,SAVE

; 宏调用,显示字符串

MAINEND 0 ; 宏调用,返回 DOS

END START

宏展开

在汇编时,用宏定义体的代码序列取代源程序中的宏指令名,而且用实际参数取代形式参数的过程。 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代,而且在取代时,实参与形参是一一对应的。

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

宏的参数 :

宏的参数使用非常灵活

宏定义时,可以无参数,例如 :MAINBEGIN ,也可以带有一个参数,例如 :MAINEND ,还可以具有多个参数;例如 :MULTIPLY

参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;

宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;

例:

;宏定义

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

;统一 4 条移位指令的宏指令 (shl,shr,sal,sar)

shift macro soprand,snum,sopcode

push cx

mov cl,snum

s&sopcode& soprand,cl

pop cx

endm

例:宏调用:  shift ax,4,ar

宏展开:

1 push cx

1 mov cl,4

1 sar ax,cl

1 pop cx 参数可以是操作码的一部分,但在宏定义体中必须用 & 作为分隔符。 & 是一个操作符,它在宏体中可作为形参的前缀,展开时把 & 前后两个符号合并形成一个符号,这个符号可是操作码、操作数和一个字符串。

;统一移位和循环移位 8 条指令的宏指令

shrot macro sroprand,srnum,sropcode

push cx

mov cl,srnum

sropcode sroprand,cl

pop cx

endm

例:

宏调用: 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

;宏调用

dstring < This is a example. >

dstring < 0 !< Number !< 10 >

;宏展开

1 db 'This is a example.', 0dh,0ah,'$'

1 db '0 < Number < 10' , 0dh,0ah, '$'

宏操作符

;; ——宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现

& ——替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符



宏操作符

< > ——字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整

! ——转义操作符 ! ,用于指示其后的一个字符作为一般字符,不含特殊意义

% ——表达式操作符,用在宏调用中,表示将后跟的一个表达式的值转换成当前基数下的数 ( 默认为 10 进制 ) 作为实参,而不是将表达式本身作为参数

例:

MSG MACRO COUNT,STRING ;宏定义

MSG&COUNT DB STRING

ENDM

ERRMSG MACRO TEXT

CNTR =CNTR +1

MSG %CNTR,TEXT

ENDM

宏调用:  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'

注意:

在程序中,宏定义必须出现在红调用以前,也就是说必须先定义后调用,因此,常常把宏定义放在所有程序段代码以前,即在程序已开始先列出程序中所用的所有的宏定义。 与宏有关的伪指令

局部标号伪指令

例:

;宏定义

absol macro oprd

local next

cmp oprd,0

jge next

neg oprd

next:

endm

如果程序中多次调用,展开后会出现标号的多重定义,这是不能允许的,为此提供了 LACOL 伪操作。

格式: LOCAL 标号列表 ( 各标号之间用逗号分隔 )

宏定义体采用了标号,应使用 LOCAL 加以说明,它必须是宏定义 MACRO 语句之后的第一条语句, LOCAL 伪操作只能用在宏定义体内,而且它必须是 MACRO 伪操作后的第一个语句,在 LOCAL 和 MACRO 伪操作之间还不允许有注释和分号标志,汇编程序对 LOCAL 伪指令的局部标号表中每个局部标号建立惟一的符号 ( 用 ??0000-??FFFF) 以代替在展开中存在的每一个局部标号。

所以上面的例子还可以定义成:

absol macro oper

local next

cmp oper,0

jge next

neg oper

next:

endm

;宏调用

………

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 宏名表

为了删除汇编时引入到内存的无用的宏定义,可以用 PURGE 伪指令把它删除。在程序中也可以使用 PURGE 伪操作来删除一个不使用的宏定义,删除宏定义的含义是使该宏定义为空,程序中如果出现了一个已经删除的宏定义的宏调用,汇编程序不会指示出错,但它将忽略该宏调用,当然也不会予以展开。

宏定义退出伪指令

格式: EXITM

伪指令 EXITM 表示结束当前宏调用的展开

宏指令名可以与指令助记符或伪操作名相同 , 在这种情况下 , 宏指令的优先级最高 , 而同名的指令或伪操作就失效了 . 伪操作 PURGE 可以用来在适当的时候取消宏定义 , 以便恢复指令的原始含义 .宏定义 :

ADD MACRO OPR1,OPR2,RESULT

...

ENDM

宏调用 :

...

ADD XX,YY,ZZ

PURGE ADD

...



在宏调用后 , 用 PURGE 伪操作取消定义 , 以便恢复 ADD 指令的原始含义 , 在 PURGE ADD 后面所用的 ADD 指令 , 则服从机器指令的定义 .

PURGE 伪操作可同时取消多个宏操作 , 此时各宏指令之间用逗号隔开 .

宏定义中允许使用宏调用 , 其限制条件是 : 必须先定义后调用。

例 : 宏定义 :

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

宏调用 :

DIFSQR VAR1, VAR2 , VAR3

宏定义体内不仅可以使用宏调用 , 也可以包含宏定义 .

宏定义 :

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 是内层的宏定义名 , 但又是外层宏定义的形参 , 所以调用 DEFMAC 时 , 就形成一个宏定义 .

宏调用 :

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.

同样 , 宏调用 :

DEFMAC SUBTRACT,SUB

会形成减法的宏定义 .

当然在形成这些宏定义后 , 就可以使用宏调用

ADDITION VAR1,VAR2,VAR3

而展开成 :

1 PUSH AX

1 MOV AX,VAR1

1 ADD AX,VAR2

1 MOV VAR3,AX

1 POP AX安防之家专注于各种家居的安防,监控,防盗,安防监控,安防器材,安防设备的新闻资讯和O2O电商导购服务,敬请登陆安防之家:http://anfang.jc68.com/
更多»您可能感兴趣的文章:
更多»有关 安防监控 的产品:
  • 安防监控资讯
  • 发表评论 | 0评
  • 评论登陆
  • 移动社区 天花之家 木门之家 灯具之家 铁艺之家 幕墙之家 五金头条 楼梯头条 墙纸头条 壁纸头条 玻璃头条 老姚之家 灯饰之家 电气之家 全景头条 照明之家 防水之家 防盗之家 区快洞察 建材 枣庄建材 临沂建材 南昌建材 上饶建材 抚州建材 宜春建材 吉安建材 赣州建材 鹰潭建材 新余建材 九江建材 萍乡建材 景德镇陶瓷 石家庄建材 衡水建材 廊坊建材 沧州建材 承德建材 建材之家 企业之家 720全景
    (c)2015-2017 Bybc.cn SYSTEM All Rights Reserved