资源描述:
《汇编语言程序设计第9-10章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、汇编语言程序设计吴向军中山大学计算机科学系第9章宏9.1.1宏的定义宏是用来代表一个具有特定功能的程序段,它只需在源程序中定义一次,但可在源程序中引用多次。只要在编写程序时需要它,就可以直接使用它。9.1宏的定义和引用在使用宏之前,必须先定义宏。定义宏一般格式如下:宏名MACRO[形参1,形参2,……]…;宏的定义体ENDM在书写宏定义时,必须遵照下列规定:第9章宏MACRO和ENDM是二个成对出现的关键字,分别表示宏定义的开始和结束;MACRO和ENDM之间的部分是宏的定义体,它是由指令、伪指令或引用其它宏所组成的
2、程序片段,是宏所包含的具体内容;“宏名”是由程序员指定的一个合法的标识符,它代表该宏;宏名可以与指令助忆符、伪指令名相同。在这种情况下,宏指令优先,而同名的指令或伪指令都失效;在ENDM的前面不要再写一次宏名,这与段或子程序定义的结束方式不同;在宏定义的首部可列举若干形式参数(也称哑元),参数之间要用逗号分隔。第9章宏例9.1:定义一个把16位数据寄存器压栈的宏。PUSHRMACROPUSHAXPUSHBXPUSHCXPUSHDXENDM例9.2:定义二个字存储变量相加的宏。MADDMMACROOPRD1,OPRD2
3、MOVAX,OPRD2ADDOPRD1,AXENDM第9章宏9.1.2宏的引用在源程序中,一旦定义了某宏,那么,在该程序的任何位置都可直接引用该宏,而不必重复编写相应的程序段。引用宏的一般格式如下:宏名[实参1,实参2,……]其中:实参的位置要与形参的位置要对应,但实参个数可以与形参个数不相等。当实参的个数多于形参的个数时,多出的实参被忽略;当实参的个数少于形参的个数时,没有实参对应的形参用“空”来对应。在宏展开时,所得到的指令必须是合法的汇编指令,否则,汇编程序将会给出出错信息。第9章宏9.1.3宏的参数传递方式引
4、用宏时,参数是通过“实参”替换“形参”的方式来实现传递的。参数形式灵活多样,参数可以是常数、寄存器、存储单元和表达式,还可以是指令的操作码。例9.3:定义二个字存储变量相加和相减的宏。方法1:定义二个宏,分别实现存储变量的加操作和减操作MADDMMACROOPRD1,OPRD2MOVAX,OPRD2ADDOPRD1,AXENDMMSUBMMACROOPRD1,OPRD2MOVAX,OPRD2SUBOPRD1,AXENDM方法2:定义一个宏,把存储变量的“加”和“减”操作合并在一起MOPMMACROOP,OPRD1,O
5、PRD2MOVAX,OPRD2OPOPRD1,AXENDM其中:参数OP是一个对应于操作码的形式参数。第9章宏9.1.5宏与子程序的区别宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别:在源程序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用;汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化;宏引用时,参数是通过“实参”
6、替换“形参”来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;宏引用语句扩展后,目标程序中就不再有宏引用语句。运行时,不会有额外的时间开销,而子程序调用指令存在于目标程序之中,执行调用指令需要时间。总之,当程序片段不长,速度是关键因素时,可采用宏来简化源程序,但当程序片段较长,存储空间是关键因素时,可采用子程序来简化源程序和目标程序。第9章宏9.2.1连接运算符9.2宏参数的特殊运算符在宏定义中,如果形式参数与其它字符连接在一起,或形式参数出现在字符串之中,那么,就必须使
7、用连接运算符(&)。例9.5:定义一个转移宏JUMP,其一个参数决定转移类别,另一个参数指定转移目标。解:JUMPMACROCON,hereJ&CONhereENDM第9章宏例9.6:定义一个问候性的字符串宏GREETING,其一个参数说明字符串的变量名,另一个参数指名问候的对象。解:GREETINGMACROMSG,nameMSGDB‘Hello,&name’ENDM假设有下面引用语句,GREETINGSTR1,张三GREETINGMSG1,John那么,它们宏扩展时将会得到如下三个问候性的字符串定义。GREETI
8、NGSTR1,张三1STR1DB‘Hello,张三’GREETINGMSG1,John1MSG1DB‘Hello,John’第9章宏9.2.2字符串整体传递运算符字符串整体传递运算符是一对尖括号<>,用它括起来的内容将作为一个字符串来进行形式参数的整体替换。在宏引用时,如果实参内包含逗号、空格等间隔符,则必须使用该操作符,以保证实参的完整性。如