当前位置:   article > 正文

8086汇编——宏汇编及多模块技术_8086宏汇编

8086宏汇编

一、宏

1.宏定义

宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对伪指令MACRO和ENDM完成。
格式:

宏名     MACRO [哑元1,哑元2,...]
             语句串
             ENDM
  • 1
  • 2
  • 3

说明:语句串代表宏定义体。宏定义并不产生目标代码,只是用来说明“宏名字”与宏定义体之间的联系。其中哑元1,哑元2,… 是虚拟参数或称形式参数,用逗号分隔。虚参(形参)可不设置。

在这里插入图片描述

2.宏调运

宏定义之后,要在程序中使用宏时,只要写出宏名字即可。使用宏的过程称为宏调用。如宏定义中有形参,那么宏调用时在宏名字后要加上实参。实参的个数应该与形参一样, 多余的参不予考虑。

在这里插入图片描述

3.宏展开

源程序在汇编时,宏指令被汇编程序用相应的程序代码所取代,这段程序即是宏定义时语句串。这个过程称为宏展开。宏展开不需要程序员负责或干预,是由汇编程序自动完成的。如果宏定义时有哑元(形参),在宏调用时就要写出实元(实参),在宏展开时汇编程序将哑元替换为实元。哑元和实元统称为变元。

在这里插入图片描述
4.宏与子程序

宏与子程序都是编写结构化程序的重要手段,两者各有特色。相同之处,宏和子程序都可以定义为一段功能程序,可以被其他程序调用。不同之处如下:

  • 宏指令利用哑元和实元进行参数传递。宏调用时用实元取代哑元,避免了子程序因参数传递带来的麻烦。
  • 变元可以是指令的操作码或操作码的一部分,在汇编的过程中指令可以改变。
  • 宏调用时没有保护断点和现场的概念,因为在汇编时已经用宏展开把这段程序插人主程序中了。而子程序每执行一次CALL指令,就要对断点和现场进行保护,把断点处的地址指针和相关寄存器人栈保存,从子程序中返回时要恢复现场和弹出断点地址。
  • 宏的缺点是随着宏调用次数的增加,主程序代码会不断加长。

通常当程序较短、传递参数较多或要快速执行时,采用宏比较合适;当程序较长或对内存空间有要求时,选用子程序比较好。

二、宏的参数

1.变元是操作数
在这里插入图片描述
2.变元是操作码
定义栈操作宏指令STACKM。
在这里插入图片描述
3.变元是操作码的一部分

变元出现在操作码中,要用&作为分隔符。

例:定义移位宏指令SHIFT

在这里插入图片描述4.变元是存储单元

在数据段中用伪指令定义存储单元时,也可以使用宏,使单元内容的设置更灵活。

例:定义存储单元宏指令DATAS。

在这里插入图片描述

5.变元是字符串

例:定义字符串宏指令MASG。

在这里插入图片描述

三、宏运算

1.&替换运算符

用于将字串与哑元连接。宏调用时,字串与相应的实元内容连在一起。

例:定义字符串宏指令DISTR

在这里插入图片描述
2.< >传递运算符

在变元为字符串时,如果实元是含有空格的字符串,则实元要用< >传递运算符括起来。

在这里插入图片描述
3. ! 转义运算符

当字符串中含有<或>字符时,为避免与传递运算符冲突,在宏调用的实元中用!表示该字符为普通字符。

在这里插入图片描述
4.% 表达式运算符

在宏调用的实元中如果有表达式, %运算符将表达式的值作为实元。

在这里插入图片描述
5. ;; 宏注释符

双分号“;;”是在宏定义中使用的注释符。其后的注释在宏调用及宏展开时不出现。

四、其他宏功能

1.宏标号

在宏定义体中,如果有分支或循环等带有标号的指令时,必须用LOCAL指定局部标号伪指令对标号进行处理。否则每调用一次宏,都要展开相同的代码,就会出现标号重复的现象,这是不允许的。

格式: LOCAL标号1 [,标号...]

将给出的标号在多次宏调用时以不同的数字取代标号,避免标号的重复定义。
说明: LOCAL 伪指令只能在宏定义体中使用,并且是宏定义体的第- - 条语句。

例:定义分支宏指 令BRANCH。
在这里插入图片描述

2.宏删除

当不需要某个宏时,可以将其删除。
格式: PURGE 宏名 [,宏名..]
功能:在汇编时将该语句中的宏定义删除。

3.宏嵌套

在宏定义中可以使用宏调用,称为宏嵌套。宏嵌套能增加宏的功能,简化宏的操作。(类似于C语言中的函数调用函数)

五、宏库的建立和调用

如果在程序中定义了多个宏,可以把这些宏一起或分类放在独立的文件中保存。这种文件与高级语言中的库文件类似,称为宏库。在需要这些宏的程序中用INCLUDE伪指令把宏库调出就可以使用这些宏了。

1.建立宏库

把多个宏的宏定义放在一个文本文件中,为其起名并加上扩展名. MAC。

2.调用宏库
在应用程序中使用宏指令之前,用INCLUDE伪指令将宏库调入。
要想查看宏展开的结果,可在汇编时 . LST列表文件。

六、结构伪操作

1.结构定义

结构名   STRUC
结构体
结构名 ENDS
  • 1
  • 2
  • 3

在这里插入图片描述
2.结构预置

结构定义之后还不能使用,要对结构预置后才能把相关信息真正存人存储器。

结构变量名    结构名 < 字段值表>
  • 1

结构变量名可任意起名,用于在程序中直接引用。结构名是结构定义时的名<字段值表>用于给结构变量赋初值。

在这里插入图片描述
3.结构引用

结构在定义和预置之后,在程序中可以使用。在引用时,直接写结构变量名。
格式 : 结构变量名.结构字段名
“.”表示对字段的访问。在使用时,可以预先将结构变量的起始地址、偏移量送至某个寄存器,再用寄存器间址代替结构变量名。

在这里插入图片描述

七、重复汇编和条件汇编

在程序编写中,如果遇到一段几条指令都一样的程序或连续的数据单元定义,可以不必写出有指令和定义,而用重复汇编来完成。重复汇编包含的内容是在汇编期间展开的,可与宏配合使用。

1.重复次数确定

REPT  重复次数  n
重复体
ENDM
  • 1
  • 2
  • 3

在这里插入图片描述
在数据段中定义了10个单元,存放30H ~ 39H。

2.重复次数不确定

格式1:
IRP  哑元,<实元1,实元2, ..>
重复体
ENDM
  • 1
  • 2
  • 3
  • 4

用实元替代哑元,重复次数由实元的个数决定。

格式2: IRPC  哑元, 字符串
  • 1

用字符串替代哑元,重复次数由字符个数决定。

在这里插入图片描述
汇编时,在代码段中连续插入了7条PUSH指令,分别是“PUSH AX”~“ PUSH BP"。

在这里插入图片描述
3.条件汇编

在源程序汇编时,如果加入了条件汇编伪指令,可以决定是否对某段程序进行汇编。这样就可以控制程序具有不同功能以及最后生成的代码。条件汇编可用于宏定义中,也可在程序使用。

IF 表达式
代码段1
ELSE
代码段2
ENDIF
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
条件汇编还有其他格式,如表8-1所示。使用方式与IF类似,

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/526361
推荐阅读
相关标签
  

闽ICP备14008679号