大三上限选汇编语言课件第7章_第1页
大三上限选汇编语言课件第7章_第2页
大三上限选汇编语言课件第7章_第3页
大三上限选汇编语言课件第7章_第4页
大三上限选汇编语言课件第7章_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章 高级汇编语言技术宏汇编重复汇编条件汇编方法1、把这组指令写成一个子程序,每次需要执行时只要调用这个子程序就可以了。方法2、当这组指令较短或不适合把它写成一个子程序时,可以把它义成一个宏,每次需要执行时就去调用这个宏。问如果在一个程序中多次使用同一组指令时,为了避免每次都要重写,该如何解决?7.1

宏汇编为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。宏:源程序中一段有独立功能的程序代码。宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。指令汇编语言程序语句伪指令(伪操作)宏指令子程序:优点:模块化,节省内存,可被多次调用,编程效率高。缺点:额外开销(保存返回地址,计算转向地址,传递参数等)大,增加了执行时间。适用于子功能代码较长、调用比较频繁的情况。宏调用:优点:参数传送简单,执行效率高。缺点:不节省空间,适用于子功能代码较短、传参较多的情况。宏定义macro_name

MACRO

[哑元表][LOCAL

标号表]…………ENDMmacro_name

宏指令名(宏名),调用时用。第一个符号必须是字母(注意与名称的差异)[哑元表]形参表,哑元之间用逗号隔开如果宏定义体有一个或多个标号,则必须用LOCAL伪操作列出所有的标号。???(宏定义体);形参/虚参一段有独立功能的程序代码宏调用macro_name

[实元表]

;

实参实元表中的实元与哑元表中的哑元在位置上一一对应;若实元数>哑元数,则多余的实元无效;若实元数<哑元数,则多余的哑元作“空(NUL)”处理;对宏指令的调用必须先定义后调用。应当注意,宏展开后,即用实参取代形式参数之后,所得到的语句应该是有效的,否则汇编时会出错。宏展开源程序被汇编时,汇编程序把宏调用展开,也就是把宏定义体复制到调用宏指令的位置上,同时用实元取代哑元,由LOCAL定义的标号也由??0000~??FFFF替代。实元(在使用上要比子程序灵活)常数、寄存器、存贮单元用寻址方式能找到的地址、表达式

指令的操作码、操作码的一部分宏调用与子程序调用的区别:子程序:在程序执行期间被调用,只占用自身大小的一段空间。主程序sub1……call

sub1……call

sub1……call……子程序sub1………………ret宏调用:在汇编期间被展开,每调用一次就把宏定义体展开一次。宏定义Q

macro

x,y宏调用宏展开endm……Q

a,b……Q

c,d……Q

e,f…………………………(1)子程序调用是在程序执行期间进行的,主程序通过CALL指令转入于程序的入口地址去执行子程序,子程序执行完后RET指令返回到主程序的调用处(断点处);而宏调用是通过宏指令名和实在参数(如果有要传递的参数的话)进行调用的,而且是在汇编期间展开宏定义体的。(2)子程序中的这组指令的机器码在存储器中只需要存放一次;而宏调用则不同,每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间就越大。(3)子程序调用时需要用堆栈,调用子程序和返回主程序都要开销必要的时间;而宏调用其宏定义体展开是插入在调用程序中,因此避免了调用时跳到宏和由宏返回所开销的时间。子程序与宏调用工作方式的差异如何选择用子程序还是用宏调用呢?可以无变元可以是操作码可以是操作码的一部分,但在宏定义体中必须用&来分隔。变元是ASCII串%操作符7.1.2

宏定义中的参数7.1.3 LOCAL伪操作在宏定义中允许使用标号。如果在程序中多次使用该宏定义时。展开后会出现标号的多重定义,这是不允许的。但是可以用伪指令LOCAL指定局部标号。[格式]LOCAL

局部标号表[说明]其中,局部标号表中的各标号之间用逗号分隔。汇编程序在汇编时对局部中标号表中的各标号建立唯一的符号(??000一??FFFF)以取代展开后的各局部标号。该伪指令必须是宏定义体中的第一个语句,而且在MACRO和LOCAL之间还不允许有注释和分号标志。7.1.4

在宏定义体内使用宏限制条件:必须先定义后调用在宏定义体内不仅可以使用宏,也可以包含宏定义(也就是说,宏定义允许嵌套)7.1.5

列表伪操作.XALL

默认值,只列出产生目标码的宏展开.LALL

列出包括注释在内的所有宏展开.SALL

不列出任何展开信息功能:控制汇编清单中宏展开的列出情况.LISTMACROALL.LISTMACRO.NOLISTMACROMASM6.0+;;

注释

;

宏展开时,;;后面的注释不予展开。源程序(ASM文件)经汇编程序汇编,主要输出是OBJ文件和LST文件(列表文件)。LST文件同时列出源程序和机器语言程序清单,并给出符号表。7.1.6

宏库的建立与调用宏库:只包含若干宏定义的文件,扩展名为MAC或LIB宏库的调用:在程序的开始用INCLUDE语句说明,例如INCLUDE

C:\MACRO.MACINCLUDE

D:\AAA\EEE.LIB注:INCLUDE语句可以不放在程序的最前面,但必须放在所有的宏调用之前宏库的建立:由定义即可7.1.7 PURGE伪操作宏指令名可与指令助记符和伪指令名同名,但这时宏指令的优先级最高,而同名的指令和伪操作便失效。伪指令PURGE可取消宏定义,恢复指令的原来功效。格式:

PURGE

宏指令名[,宏指令名,…]PURGE可取消多个宏定义,而各宏指令名之间应以逗号分隔。功能:取消宏定义,使该宏定义为空。例7.1

两个字相乘宏定义:multiply

MACRO

opr1,opr2,resultpush

dxpush

axmov ax,

opr1imul

opr2mov

result,

axpop

axpop

dxENDM宏调用:multiplycx,

var,

xyz[bx]宏展开:+pushdx+pushax+movax,

cx+imulvar+movxyz[bx],

ax+popax+popdx例7.2

保存寄存器宏定义:savereg

MACROpush

axpush

bxpush

cxpush

dxpush

sipush

diENDM宏调用:savereg宏展开:+pushax+pushbx+pushcx+pushdx+pushsi+pushdi例宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。宏定义:add

MACRO

opr1,

opr2,

result…………ENDM宏调用:……add

xx,

yy,

zz;取消宏定义purge

add……例求绝对值(使用LOCAL伪操作)宏定义:absolMACROLOCALopernextcmp oper,

0jge

nextneg

opernext:ENDM宏调用:……absol

var……absol

bx……宏展开:……+++cmp

var,

0jge

??0000neg

var+

??0000:……+++cmp bx,

0jge

??0001neg

bx+

??0001:……宏汇编操作符&符号1

&

符号2;;

%;宏展开时,合并前后两个符号形成一个符号。leapcond,

lablabmacroj&condendm例7.4宏定义:宏调用:leap z,

there……leapnz,

here宏展开:+

jz

there……+

jnz

here;;

注释

;

宏展开时,;;后面的注释不予展开。例:Q每次展开保留此注释

每次展开不保留此注释MACRO

m; display

a

message;;

m

is

a

string……ENDM%

表达式

;汇编程序将%后面的表达式转换为数字,并在展开期间用这个数取代哑元。7.2

重复汇编在编写汇编语言程序中,有时需要进行连续地重复完成相同的或几乎完全相同的操作,这时可以使用重复汇编,使书写的程序变得相当简洁。重复汇编有两种格式重复伪操作不定重复伪操作[说明]其中,REPT和ENDM为伪指令,它们必须成对出现,中间是要重复的指令体,重复的次数由表达式的值来决定。注意:重复伪操作并不一定要用在宏定义体内。[格式]REPT

表达式….RNDM7.2.1

重复伪操作例题:7.13X=0REPT

10X=X+1DB

XENDM汇编后产生1DB11DB21DB3.1DB10例题:7.14

将字符A-Z填入到数组TABLECHAR

=‘A’TABLE

LABLE

BYTEREPT

26DB

CHARCHAR=CHAR+1ENDMIRP

伪操作[格式]

IRP

形式参数,<参数表>…

(指令体)ENDM[说明]其中,IRP和ENDM伪指令必须成对出现,其间是要重复的指令体。重复的次数由参数表中参数的个数所决定,而且每重复一次,依次用参数表中的参数来代替形式参数。参数表必须用尖括号括起来,参数间用逗号分隔。7.2.2

不定重复伪操作IRP伪操作例题:7.17IRP X,

<1,2,3,4,5,6,7,8,9

>DB

XENDM汇编后1DB11DB2..1DB9IPRC伪操作[格式]IRPC

形式参数,字符串(或<字符串>)…

(指令体)ENDM[说明]其中,伪指令IRPC和ENDM必须成对出现,其间是重复的指令体,重复的次数取决于字符串中字符的个数,在每次重复时,依次用字符串的字符代替形式参数。7.2.2

不定重复伪操作IPRC伪操作7.3

条件汇编汇编语言提供了一组条件伪操作,用来指示编程序对给定的条件进行测试,并根据测试的结果有选择地对一段语句进行汇编处理。换句话说,汇编程序根据给定的条件是否为真来决定对一段语句是否进行汇编。例题:7.19IRPC

X,

01234567DB

X+1ENDM汇编后1DB11DB21DB87.3

条件汇编[格式]IF

xxxx

[<表达式>]…

条件为真汇编此块[ELSE]…

条件为假汇编此块[说明]ENDIF其中,IF

xxxx表示条件伪操作命令,它必须与ENDIF相配对。汇编程序对于条件伪操作命令中给定的条件进行检测,若条件成立(真),则汇编整个块。如果其中有ELSE命令,当条件成立时则只汇编从IFxxxx到ELSE之间的那一块;当条件不成立(假)时则只汇编从ELSE到ENDIF之间的那一块。各种条件伪操作命令,其表达式的形式及检测条件如表7.3.1

条件伪操作IF

使用举例MAX

MARCO

K,A,B,CLOCAL

NEXT,OUTMOV

AX,AIF

K-1IF

K-2CMP

C,AXJLE

NEXTMOV

AX,CENDIFNEXT:CMP

B,AXJLE

OUTMOV AX

,BENDIFOUT:ENDM例:7.22BRANCHMARCO

XIF

($-X)

LT

128JMP

SHORT

XELSEJMPENDIFNEAR

PTR

X例:7.23宏定义的递归调用,条件伪操作可以用来结束宏递

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论