资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章学习要点:,(,1,)宏汇编,(,2,)重复汇编,(,3,)条件汇编,一、宏、宏汇编,宏是计算机软件系统中一个广泛存在的概念。从办公软件,OFFICE,到程序开发语言,C,等等,可以把某项要操作的某一个过程定义为宏。,具体到在汇编语言中,宏也是汇编的主要特点之一,它是与子程序类似但又独具特色的另外一种简化源程序的方法。,(一)宏指令的定义和使用,宏指令在使用之前要先定义,其格式一般如下:,宏指令名,MACRO ,形式参数表, ;,参数的另外一个名称变元,(宏定义体),ENDM,可选的形式参数表可由若干参数组成,各形参间用逗号分隔。,1,例如,把通过,DOS,的,1,功能调用从键盘读入一个字符的程序片段定义为一个宏:,GETCH MACRO,MOV AH , 1,INT 21H ;,从键盘键入一个字符时,该字符存入,AL,ENDM,在定义宏指令后,就可以通过宏指令来表示对应的程序片段,这成为宏调用。其格式为:,宏指令名,实参表,在对源程序汇编时,汇编程序把程序中的宏指令替换成对应的宏定义体,这称为宏展开或宏扩展。如:, .,GETCH,对应为,- MOV AH , 1, INT 21H,2,尽管都实现了调用,但是宏调用和子程序的调用是有差别的:,宏调用更多地是表示一种替换!,3,(二)宏指令的用途,1.,缩短源代码,2.,扩充指令集,3.,更改某些指令助记符的意义,(宏指令的优先级高于指令和伪指令),(三)宏指令中参数的使用,宏指令可以不带参数,但往往带有参数的宏指令更具灵活性。,1.,指令的参数可以是常数、寄存器和存储单元,还可以是表达式。,例:,MOV CL , 4,SAL AL , CL,如上述代码要多次使用,就可以定义为:,SHIFT MACRO,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,改宏被调用和展开的时候,意义就明确了。如:,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 , AR”,或 “,SHIFT 8 , SI , HR ”,等等。,6,3.,宏调用参数个数可以与定义时不一致,正常情况下,宏调用时使用的实参个数应该与宏定义时的形参个数一致,但汇编程序并不要求他们它们必须相等。,若实参个数多于形参个数,那么多余的实参被忽略;,若实参个数少于形参的个数,那么多余的形参用“空”代替。,4.,两个特殊的宏运算符,(,1,)强迫替换运算符,&,在宏定义中,若参数在其它字符的紧前或紧后,或者参数出现在带引号的字符串中时,就必须使用该运算符,以区分参数。,例:在下面宏指令,JUMP,中,参数,CON,作为操作码一部分。,JUMP MACRO 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 , 24H,(,2,)表达式运算符,%,在宏调用时,使用该运算符把其后表达式的结果作为宏参替换,而非表达式自身。,宏,MSGGEN,的定义方式如上例。,则调用,MSGGEN MSG , %(2 + 3) , TOM,展开为:,MSG5 DB HELLO MR.TOM , 0DH , 0AH , 24H,8,5.,与宏有关的伪指令,(,1,)局部标号说明伪指令,LOCAL,格式:,LOCAL,标号表,标号表由标号构成,标号间用逗号分隔。,汇编程序在每次展开时,总把由,LOCAL,伪指令说明的标号用唯一的符号(?,0000,至?,FFFF,)代替,从而避免标号重定义错误。,例如:定义一个取绝对值的宏,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,宏名表,例如:,AAA MACRO,ENDM,;,宏,AAA,可以有效使用的区间,PURGE AAA,;,宏,AAA,不可有效地使用,11,例:利用宏指令修改某些助记符意义,宏定义:,ADD MACRO OP1 , OP2 , RESULT,ENDM,宏调用:,ADD X , Y , Z;,使用宏,ADD,PURGE ADD,;,使用指令,ADD,当然,最后能不能达成所愿,还要具体看编译器是怎么来支持的!,12,6.,宏定义的嵌套,宏定义的嵌套有两种情况:宏定义体中含宏调用;宏定义体中含宏定义。,(,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,)宏定义体中定义宏指令,宏定义体中还允许包含宏定义,但是只有在调用了外围的宏后,才能调用内层的宏。,例如:,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,ENDMMOV Z , AX,POP AX,ENDM,于是:可以使用“,ADDITION VAR1 ,VAR2, VAR3”,调用宏。,14,7.,宏调用综合示例,15,二、重复汇编,有时候程序中会连续地重复完全相同或几乎相同的一组语句。当出现这种情况时,可考虑用重复伪指令定义重复块,以简化源程序。,1.,伪指令,REPT,伪指令,REPT,用于创建重复块,重复块的重复次数由一数值表达式给定。一般格式如下:,REPT,表达式,需重复的语句组,ENDM,宏汇编程序将把“需重复的语句组”连续低重复汇编由表达式值所决定的次数,就相当于是重写了多少次!,例:,X = 0,REP 5,DB X,X = X + 1,ENDM;,相当于 “,DB 0,1,2,3,4”,16,2.,伪指令,IRP,伪指令,IRP,用于创建重复块,重复次数及每次使用的实参由实参数列决定。,一般格式如下:,IRP,形式参数, ,需重复的语句组,ENDM,实参的个数规定了重复的次数。,例:下面的重复块实现把,0-9,的平方值存入存储区中。,IRP X , ,DB X * X,ENDM,再如:下面重复块吧若干寄存器值压入堆栈。,IRP REG , ,PUSH REG,ENDM,17,3.,伪指令,IRPC,伪指令,IRPC,与伪指令,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,三、条件汇编,汇编条件语句可以根据某种条件决定是否汇编某段源程序,从而方便地产生功能不同的程序。,(一)条件汇编伪指令,基本格式:,IFxxxx,条件表达式,语句组,1,ELSE,语句组,2,ENDIF,IFxxxx,是条件伪指令助记的一般形式,其中,xxxx,表示构成条件伪指令的其它字符。,19,条件伪操作,说明,IF expression,表达式的值非,0,则满足条件。,IFE expression,表达式的值为,0,则满足条件。,IFDEF symbol,该符号已在程序中有定义,则满足条件。,IFNDEF symbol,该符号未曾定义,则满足条件。,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,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,
展开阅读全文