ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt

上传人:牧羊曲112 文档编号:6507780 上传时间:2023-11-07 格式:PPT 页数:28 大小:529KB
返回 下载 相关 举报
ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt_第1页
第1页 / 共28页
ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt_第2页
第2页 / 共28页
ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt_第3页
第3页 / 共28页
ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt_第4页
第4页 / 共28页
ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt》由会员分享,可在线阅读,更多相关《ibm-pc汇编语言程序设计(沈美明第二版)第五章高级汇编语言技术.ppt(28页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计,北京理工大学 电子工程系,马永锋,第五章 高级汇编语言技术,5.1 宏的定义和引用5.2 宏参数的特殊运算符5.3 与宏有关的伪指令5.4 重复汇编伪指令5.5 条件汇编伪指令,5.1 宏的定义和引用,宏是用来代表一个具有特定功能的程序段,它只需在源程序中定义一次,但可在源程序中引用多次。只要在编写程序时需要它,就可以直接使用它。,(1)宏的定义,在使用宏之前,必须先定义宏。定义宏一般格式如下:宏名 MACRO 形参1,形参2,;宏的定义体 ENDM 在书写宏定义时,必须遵照下列规定:,宏的定义,MACRO和ENDM是二个成对出现的关键字,分别表示宏定义的开始和结束;MACR

2、O和ENDM之间的部分是宏的定义体,它是由指令、伪指令或引用其它宏所组成的程序片段,是宏所包含的具体内容;“宏名”是由程序员指定的一个合法的标识符,它代表该宏;宏名可以与指令助忆符、伪指令名相同。在这种情况下,宏指令优先,而同名的指令或伪指令都失效;在ENDM的前面不要再写一次宏名,这与段或子程序定义的结束方式不同;在宏定义的首部可列举若干形式参数(也称哑元),参数之间要用逗号分隔。,宏的定义,例9.1:定义一个把16位数据寄存器压栈的宏。PUSHRMACROPUSHAXPUSHBXPUSHCXPUSHDXENDM例9.2:定义二个字存储变量相加的宏。MADDMMACRO OPRD1,OPRD

3、2MOVAX,OPRD2ADDOPRD1,AXENDM,(2)宏的引用,在源程序中,一旦定义了某宏,那么,在该程序的任何位置都可直接引用该宏,而不必重复编写相应的程序段。引用宏的一般格式如下:宏名 实参1,实参2,其中:实参的位置要与形参的位置要对应,但实参个数可以与形参个数不相等。当实参的个数多于形参的个数时,多出的实参被忽略;当实参的个数少于形参的个数时,没有实参对应的形参用“空”来对应。在宏展开时,所得到的指令必须是合法的汇编指令,否则,汇编程序将会给出出错信息。,(3)宏参数的传递,引用宏时,参数是通过“实参”替换“形参”的方式来实现传递的。参数形式灵活多样,参数可以是常数、寄存器、存

4、储单元和表达式,还可以是指令的操作码。例9.3:定义二个字存储变量相加和相减的宏。方法1:定义二个宏,分别实现存储变量的加操作和减操作MADDMMACRO OPRD1,OPRD2MOVAX,OPRD2ADDOPRD1,AXENDMMSUBMMACRO OPRD1,OPRD2MOVAX,OPRD2SUBOPRD1,AXENDM方法2:定义一个宏,把存储变量的“加”和“减”操作合并在一起MOPMMACRO OP,OPRD1,OPRD2MOVAX,OPRD2OPOPRD1,AXENDM其中:参数OP是一个对应于操作码的形式参数。,(4)宏与子程序的区别,宏和子程序都是为了简化源程序的编写,提高程序的

5、可维护性,但是它们二者之间存在着以下本质的区别:在源程序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用;汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化;宏引用时,参数是通过“实参”替换“形参”来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;宏引用语句扩展后,目标程序中就不再有宏引用语句。运行时,不会有额外的时间开销,而子程序调用指令存在于目标程序之中,执行调用指令需要时间。总之,当程序片段

6、不长,速度是关键因素时,可采用宏来简化源程序,但当程序片段较长,存储空间是关键因素时,可采用子程序来简化源程序和目标程序。,5.2 宏参数的特殊运算符(1),(1)连接运算符&在宏定义中,如果形式参数与其它字符连接在一起,或形式参数出现在字符串之中,那么,就必须使用连接运算符(&)。例:定义一个转移宏JUMP,其一个参数决定转移类别,另一个参数指定转移目标。宏定义:JUMPMACRO COND,here J&CONDhereENDM宏调用:JUMP Z,THERE JUMP NZ HERE宏展开:+JZ THERE+JNZ HERE,宏参数的特殊运算符(2),(2)字符串整体传递运算符,字符串

7、整体传递运算符是一对尖括号,用它括起来的内容将作为一个字符串来进行形式参数的整体替换。在宏引用时,如果实参内包含逗号、空格等间隔符,则必须使用该操作符,以保证实参的完整性。如果实参是某个具有特殊含义的字符,为了使它只表示该字符本身,也需要用该运算符括起来。假设有下面定义字符串的宏DEFMSG,DEFMSG MACRO MSG DB&MSG,0DH,0AH,$ENDM 那么,使用和不使用该运算符的引用宏及其宏扩展如下所示:DEFMSG 1 DB Are you ready?,0DH,0AH,$DEFMSG Are you ready?1 DB Are,0DH,0AH,$,宏参数的特殊运算符(3)

8、,(3)字符转义运算符,在引用宏时,如果实参中含有特殊字符,而又要该特殊字符当作普通字符来出来,那么,就必须在该特殊字符前加上字符转义运算符“!”。DEFMSG 90):1DB Input one number(90):,0DH,0AH,$DEFMSG 90):1DB Input one number(90):,0DH,0AH,$在第一个引用宏的语句中,汇编程序会把第一个“”字符与字符“”字符前面加了字符转义运算符“!”,所以,汇编程序会把第一个“”当作“大于号”字符来处理,而把最后面的字符“”当作是与前面“”相比配的结束符。,宏参数的特殊运算符(4),(4)计算表达式运算符,在引用宏时,使用

9、计算表达式运算符“%”表示把其后面表达式的结果当作实参进行替换,而不是该表达式的整个式子。DEFMSG%200+23-1001DB 123,0DH,0AH,$DEFMSG(200+23-100)1DB(200+23-100),0DH,0AH,$前者是先计算出表达式200+23-100的值,然后再把该值作为参数进行替换,而后者是把表达式(200+23-100)当作一个字符串来进行参数替换。,5.3 与宏有关的伪指令(1),(1)局部标号伪指令 LOCAL,在宏定义体中,如果存在标号,则该标号要用伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于一次引用该宏时,汇编程序在进行宏扩展后将会给

10、出:标号重复定义的错误。伪指令LOCAL的一般格式如下:LOCAL标号1,标号2,伪指令LOCAL必须是伪指令MACRO后的第一条语句,在MACRO和LOCAL之间也不允许有注释和分号标志。汇编程序在每次进行宏扩展时,总是把由LOCAL说明的标号用一个唯一的符号(从?0000到?FFFF)来代替,从而避免标号重定义的错误。,与宏有关的伪指令,例9.7:编写求一个求绝对值的宏。解:方法1:ABSMACRO word1CMPword1,0JGEnextNEGword1next:ENDM 假设对宏ABS有以下两次引用,ABSBXABSAL 汇编程序将显示“标号重复定义”的错误,我们需要用下面的方法定

11、义该宏。,与宏有关的伪指令,方法2:ABSMACRO word1LOCALnextCMPword1,0JGEnextNEGword1next:ENDM假设有下面两次宏ABS的引用,ABSBX汇编程序对它们进行宏扩展时,将得到下列程序片段:ABSBX1CMPBX,01JGE?00001NEGBX1?0000:,与宏有关的伪指令,伪指令LOCAL在子程序中也可起作用,但它的作用与宏定义的作用是不同的,有关该伪指令在子程序和宏定义中功能的主要差异如下表所列。伪指令LOCAL在子程序和宏中的比较,与宏有关的伪指令(2),(2)取消宏定义伪指令PURGE 伪指令PURGE的一般格式如下:PURGE宏名1

12、,宏名2,该伪指令通知汇编程序取消“宏名1,宏名2,”宏名表中的宏定义。在此语句后,如果还有这些宏的引用语句,则汇编程序不会把它们当作宏引用来进行扩展,并且还将显示出错信息。(3)中止宏扩展伪指令 EXITM伪指令EXITM的一般格式如下:EXITM 该伪指令书写在宏定义体中,用来告诉汇编程序:如果遇到该伪指令,那么,立即中止对该伪指令之下语句的扩展。如果在嵌套的内层宏中遇到了该伪指令,则退出到宏嵌套的外层。在一般情况下,伪指令EXITM与条件伪指令一起使用,以便在不同的条件下挑选出不同的语句。,5.4 重复汇编伪指令,在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可

13、利用重复伪指令来重复语句,从而达到简化程序的目的。重复汇编伪指令所定义的重复块是宏的一种特殊形式,也是由伪指令ENDM来结束重复块。用重复汇编伪指令定义的重复块也可带有参数,并在汇编过程中参数被实参代替,但重复块不会被命名,不能在程序的其它地方引用。(1)伪指令REPT 伪指令REPT的作用是把一组语句重复指定的次数,该重复次数由伪指令后面的数值表达式来确定。其一般使用格式如下:REPT数值表达式重复的语句组ENDM,重复汇编伪指令,例:定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。方法1:用伪指令REPT来实现Table LABEL TYPEREPT100DB 32

14、ENDM 上述重复块的汇编结果如下:Table LABEL TYPEDB 32DB 32DB 32;上述字节定义重复100次,重复汇编伪指令,例:定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。Table LABEL TYPECOUNT=1REPT100DB COUNTCOUNT=COUNT+1ENDM 上述重复块的汇编结果相当于:Table LABEL TYPEDB 1DB 2DB 100,重复汇编伪指令,例:计算1+2+1000,并把其值存入寄存器AX。方法1:用伪指令REPT来实现MOVAX,0COUNT=1REPT1000ADD AX,COUNTC

15、OUNT=COUNT+1ENDM 上述重复块的汇编结果与下面程序段相一致:MOVAX,0ADD AX,1ADD AX,2ADD AX,1000 虽然上面这些语句的执行能完成本例所指定的功能,但它是用1000条加法指令来直接计算的,这1000条指令无疑会大大增加目标代码的长度。,重复汇编伪指令,方法2:用循环指令LOOP来实现MOVAX,0MOVCX,1000again:ADDAX,CXLOOPagain,伪指令REPT与循环指令起作用的时期和方式是截然不同的,主要差异见下表:,重复汇编伪指令,(2)伪指令IRP 伪指令IRP的作用是用每个参数创建一组语句,其重复次数由伪指令后面参数表中参数的个

16、数来确定。其一般使用格式如下:IRP形式参数,重复的语句组ENDM例:把16位通用寄存器之值相加,并把结果存入寄存器AX。解:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。IRPREG,ADD AX,REGENDM,重复汇编伪指令,(3)伪指令IRPC 伪指令IRPC的作用与IRP相似,其实参表是一个字符串,并对字符串中的每个字符创建一组语句,所以,其重复次数是由该字符串中的字符数来确定。IRPC形式参数,字符串重复的语句组ENDM例:把16位数据寄存器之值相加,并把结果存入寄存器DI。解:由于16位数据寄存器是AX、BX、CX和D

17、X,它们的名称中只有第一个字符不同,所以,可以用伪指令IRPC来实现。XORDI,DIIRPCREG,ABCDADD DI,REG符号&是连接运算符ENDM,5.5 条件汇编伪指令,(1)条件汇编伪指令的功能条件汇编伪指令的一般格式如下:IFnnnn条件表达式语句组1ELSE语句组2ENDIF其中:IFnnnn是表伪指令,“”内的语句是可选的。条件汇编伪指令是在汇编程序把源程序转换成目标程序时起作用,其一般含义是:若条件汇编伪指令后面的“条件表达式”为真,那么,语句组1将被汇编;否则,语句组2将被汇编(如果含有ELSE伪指令)。,条件汇编伪指令,表9.3 条件汇编伪指令及其功能一览表,条件汇编

18、伪指令,例:编写一个可用DOS或BIOS功能调用输入字符的宏定义。解:方法1:使用条件汇编伪指令IFINPUTMACROIFDOS;当符号DOS不为0时,则使用DOS的功能调用 MOVAH,1H INT21HELSE;否则,将使用BIOS的功能调用 MOVAH,10H INT16HENDIFENDM在引用宏INPUT时,汇编程序会根据DOS是否为0来生成不同的程序段。,条件汇编伪指令,例:编写一个可用功能调用输入字符的宏定义。解:READCH MACRO char MOVAH,1H INT21H;接受一个字符,并存入AL中 IFNB;若参数char有实参与之对应 IFDIF,;若参数charAL,则把字符保存到实参中 MOV char,AL ENDIF ENDIFENDM,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号