汇编语言-宏指令



《汇编语言-宏指令》由会员分享,可在线阅读,更多相关《汇编语言-宏指令(23页珍藏版)》请在装配图网上搜索。
1、单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,,本章学习要点:,,(,1,)宏汇编,,(,2,)重复汇编,,(,3,)条件汇编,,,一、宏、宏汇编,,宏是计算机软件系统中一个广泛存在的概念。从办公软件,OFFICE,到程序开发语言,C,等等,可以把某项要操作的某一个过程定义为宏。,,具体到在汇编语言中,宏也是汇编的主要特点之一,它是与子程序类似但又独具特色的另外一种简化源程序的方法。,,(一)宏指令的定义和使用,,宏指令在使用之前要先定义,其格式一般如下:,,宏指令名,MACRO [,形式参数表,] ;,参数的另外一个名称变元,,,
2、……,(宏定义体),,,ENDM,,,可选的形式参数表可由若干参数组成,各形参间用逗号分隔。,1,,,例如,把通过,DOS,的,1,功能调用从键盘读入一个字符的程序片段定义为一个宏:,,,GETCH MACRO,,MOV AH , 1,,INT 21H ;,从键盘键入一个字符时,该字符存入,AL,,ENDM,,,,在定义宏指令后,就可以通过宏指令来表示对应的程序片段,这成为宏调用。其格式为:,,宏指令名,[,实参表,],,,在对源程序汇编时,汇编程序把程序中的宏指令替换成对应的宏定义体,这称为宏展开或宏扩展。如:,,,…… ….,,GETCH,对应为,---> MOV AH
3、, 1,,…… INT 21H,,…,2,,,尽管都实现了调用,但是宏调用和子程序的调用是有差别的:,宏调用更多地是表示一种替换!,3,,,(二)宏指令的用途,,,1.,缩短源代码,,,2.,扩充指令集,,,3.,更改某些指令助记符的意义,,(宏指令的优先级高于指令和伪指令),,,(三)宏指令中参数的使用,,宏指令可以不带参数,但往往带有参数的宏指令更具灵活性。,,,1.,指令的参数可以是常数、寄存器和存储单元,还可以是表达式。,,例:,MOV CL , 4,,SAL AL , CL,,,如上述代码要多次使用,就可以定义为:,,,SHIFT MACRO
4、,,MOV CL , 4,,SAL AL , CL,,ENDM,4,,,但是,如果每次的移位次数不同了,则可定义为:,,,SHIFT MACRO X ;X,为参数,,,MOV CL , X,,SAL AL , CL,,ENDM,,,这是,调用方式可为:,,,SHIFT 4 ;,移,4,位,,,SHIFT 6 ;,移,6,位,显然,有参数时使用起来更灵活。,,,2.,宏指令的参数可以是操作码,,例如:有下面的宏定义:,,,MANDM MACRO OPR , X , Y,,MOV AX , X,,OPR AX , Y,,MOV X , AX,,ENDM,,,该宏定义的意思是?????,5,,,
5、改宏被调用和展开的时候,意义就明确了。如:,,,MANDM MOV , [BX] , [SI],,MANDM ADD , [BX] , ES:[1234H],,,,参数还可以是操作码的一部分:,,,SHIFT MACRO X , Y , Z,,MOV CL , X,,S&,起符号连接作用,,,ENDM,,,调用:,SHIFT 4 , AL , AL,,,展开为:,,,MOV CL , 4 ;4,为参数,X,,SAL AL , CL ;,第,1,个“,AL”,为参数,Z,,第,2,个“,AL”,为参数,Y,,,该宏的调用方式还可以是:,,“,SHIFT 6 , BX
6、 , AR”,或 “,SHIFT 8 , SI , HR ”,等等。,6,,3.,宏调用参数个数可以与定义时不一致,,正常情况下,宏调用时使用的实参个数应该与宏定义时的形参个数一致,但汇编程序并不要求他们它们必须相等。,,若实参个数多于形参个数,那么多余的实参被忽略;,,若实参个数少于形参的个数,那么多余的形参用“空”代替。,,,,4.,两个特殊的宏运算符,,(,1,)强迫替换运算符,&,,,在宏定义中,若参数在其它字符的紧前或紧后,或者参数出现在带引号的字符串中时,就必须使用该运算符,以区分参数。,,例:在下面宏指令,JUMP,中,参数,CON,作为操作码一部分。,,,JUMP MACRO
7、CON , LAB,,J&CON LAB,,ENDM,,,则调用时,,JUMP NZ HEAR -> JNZ HEAR,,JUMP Z , THERE -> JZ THERE,7,,,例:在下面宏指令,MSGGEN,中,两个参数合并成一个标号,一个参数用在字符串中。,,,MSGGEN MACRO LAB , NUM , XYZ,,LAB&NUM DB ‘HELLO MR.&XYZ’ , 0DH , 0AH , 24H,,MSGGEN,,,则调用,MSGGEN MSG , 1 , TAYLOR,,,展开为:,MSG1 DB ‘HELLO MR.TAYLOR’ , 0DH , 0AH
8、, 24H,,,,(,2,)表达式运算符,%,,,在宏调用时,使用该运算符把其后表达式的结果作为宏参替换,而非表达式自身。,,宏,MSGGEN,的定义方式如上例。,,则调用,MSGGEN MSG , %(2 + 3) , ‘TOM’,,,展开为:,,,MSG5 DB ‘HELLO MR.TOM’ , 0DH , 0AH , 24H,8,,5.,与宏有关的伪指令,,(,1,)局部标号说明伪指令,LOCAL,,,格式:,LOCAL,标号表,,标号表由标号构成,标号间用逗号分隔。,,汇编程序在每次展开时,总把由,LOCAL,伪指令说明的标号用唯一的符号(??,0000,至??,FFFF,)代替,从而
9、避免标号重定义错误。,,例如:定义一个取绝对值的宏,,,ABSOL MACRO OPER,,LOCAL NEXT,,CMP OPER , 0,,JGE NEXT,,NEG OPER,,NEXT: ENDM,9,,,宏调用,,,ABSOL VAR,,ABSOL BX,,,时,宏展开:,,,… ;,主程序中的代码段,,,…,,CMP VAR , 0,,JGE ??0000,,NEG VAR,,??0000,:,,,CMP BX , 0,,JGE ??0001,,NEG BX,,??0001,:,,,…,10,,(2),清除宏定义的为指令,PURGE,,,格式:,PURGE,宏名表,,例如:,,
10、,…,,AAA MACRO,,…,,ENDM,,…,,… ;,宏,AAA,可以有效使用的区间,,,…,,PURGE AAA,,…,,… ;,宏,AAA,不可有效地使用,,,…,11,,,例:利用宏指令修改某些助记符意义,,宏定义:,,,ADD MACRO OP1 , OP2 , RESULT,,…,,ENDM,,,宏调用:,,,…,,ADD X , Y , Z ;,使用宏,ADD,,PURGE ADD,,… ;,使用指令,ADD,,,,当然,最后能不能达成所愿,还要具体看编译器是怎么来支持的!,,,,,12,,6.,宏定义的嵌套,,宏定义的嵌套有两种情况:宏定义体中含宏调用;宏定义体中含
11、宏定义。,,(,1,)宏定义体中宏调用,,宏汇编语言允许在宏定义体中使用宏调用,但限制条件是:必须先定义后调用。,,例如:,,,DIF MACRO X , Y ; X – Y,送,AX,,MOV AX , X,,SUB AX , Y,,ENDM,,,DIFSQR MACRO OPR1 , OPR2 , RESULT; ( X – Y),2,,送,AX,,PUSH DX,,PUSH AX | POP AX,,DIF OPR1 , OPR2 ;,注意堆栈,| POP DX,,IMUL AX | ENDM,,MOV RESULT , AX,13,,,(,2,)宏定义体中定义宏指令,
12、,宏定义体中还允许包含宏定义,但是只有在调用了外围的宏后,才能调用内层的宏。,,例如:,,,DEFMAC MACRO MACNAME , OPER,,MACNAME MACRO X , Y , Z,,PUSH AX,,MOV AX , X |,有宏调用,: DEFMAC ADDITION,ADD,,OPER AX , Y |,展开:,ADDITION MACRO X,Y,Z,,MOV Z , AX | PUSH AX,,POP AX | MOV AX , X,,ENDM | ADD AX , Y,,ENDM MOV Z , AX,,POP AX,,ENDM,,
13、,于是:可以使用“,ADDITION VAR1 ,VAR2, VAR3”,调用宏。,14,,7.,宏调用综合示例,,,15,,,二、重复汇编,,有时候程序中会连续地重复完全相同或几乎相同的一组语句。当出现这种情况时,可考虑用重复伪指令定义重复块,以简化源程序。,,,1.,伪指令,REPT,,,伪指令,REPT,用于创建重复块,重复块的重复次数由一数值表达式给定。一般格式如下:,,,REPT,表达式,,需重复的语句组,,,ENDM,,,宏汇编程序将把“需重复的语句组”连续低重复汇编由表达式值所决定的次数,就相当于是重写了多少次!,,例:,X = 0,,REP 5,,DB X,,X = X + 1
14、,,ENDM ;,相当于 “,DB 0,1,2,3,4”,16,,2.,伪指令,IRP,,,伪指令,IRP,用于创建重复块,重复次数及每次使用的实参由实参数列决定。,,一般格式如下:,,,IRP,形式参数,, <,实参,1,,实参,2 ,……,,实参,n>,,,需重复的语句组,,,ENDM,,,实参的个数规定了重复的次数。,,例:下面的重复块实现把,0-9,的平方值存入存储区中。,,,IRP X , ,,DB X * X,,ENDM,,,再如:下面重复块吧若干寄存器值压入堆栈。,,,IRP REG , ,,PUSH REG,,ENDM,17,,3.,伪指令,IRPC,,,伪指令,IRPC,
15、与伪指令,IRP,相似,但实参数列是一个字符串。,,一般格式如下:,,,IRPC,形式参数,,,字符串,,需重复的语句组,,,ENDM,,,字符串的长度规定了重复的次数。,,如果字符串含有空格、逗号等分隔符,那么字符串需用一对尖括号括起来。,,例:,IRPC X , 0123,,DB X,,ENDM,,,展开后是得到:,DB 0 , 1 , 2,,,3,,,还是:,DB ‘0’ , ‘1’ , ‘2’ , ‘3’,,,记住:宏更多地表现为一种替换!,18,,,例:,IRPC X , 0123,,DB ‘&X’,,ENDM,,,展开后是得到:,DB ‘0’ , ‘1’ , ‘2’ , ‘3’,,
16、,三、条件汇编,,汇编条件语句可以根据某种条件决定是否汇编某段源程序,从而方便地产生功能不同的程序。,,(一)条件汇编伪指令,,基本格式:,,,IFxxxx,条件表达式,,语句组,1,,[ELSE,,,语句组,2],,ENDIF,,IFxxxx,是条件伪指令助记的一般形式,其中,xxxx,表示构成条件伪指令的其它字符。,19,,条件伪操作,说明,IF expression,表达式的值非,0,则满足条件。,IFE expression,表达式的值为,0,则满足条件。,IFDEF symbol,该符号已在程序中有定义,则满足条件。,IFNDEF symbol,该符号未曾定义,则满
17、足条件。,IFB ,如自变量为空则满足条件。,IFNB ,如自变量不为空则满足条件。,IFIDN, , ,如果字符串,,和字符串,,相同,则满足条件。,IFDIF, , ,如果字符串,,和字符串,,不相同,则满足条件。,20,,,例:宏指令,MAX,把三个变元中的最大值放入,AX,,而且使变元数不同时产生不同的程序片段。,,,MAX MACRO K , A , B , C,,LOCAL NEXT , OUT ;,说明具体引用的标号,NEXT,OUT,,MOV AX , A,,IF K-1,,IF K – 2,,CMP C , AX,,JLE NEXT,,MOV AX , C,,ENDIF,
18、,NEXT: CMP B , AX,,JLE OUT |,宏调用:,,,MOV AX , B | MAX 1 , P,,ENDIF | MAX 2 , P , Q,,OUT: ENDM | MAX 3 , P , Q , R,21,,,例:宏指令,GOTO,根据参数情况产生不同的转移效果。,,,GOTO MACRO L , X , REL , Y,,IFB ,,JMP L,,ELSE,,MOV AX , X,,CMP AX ,Y,,J&REL L,,ENDIF,,ENDM,,,,宏调用“,GOTO LOOP , SUM , NZ , 15”,产生一个结果。,,宏调用“,GOTO EXT”,产生一个结果。,22,,,宏定义可允许递归调用,可用条件伪操作来结束宏递归。,,例:对操作数,X,左移,N,次,这个过程可由递归实现。,,,POWER MACRO X , N,,SAL X , 1,,COUNT = COUNT + 1,,IF COUNT – N,,POWER X , N ;,通过,COUNT,来控制,而非参数,N,来控制,,,ENDIF,,ENDM,,,,宏调用:,,,COUNT = 0,,POWER AX , 3,23,,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。