二、重复汇编 有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。 1.重复伪操作 其格式为: REPT expression ... (重复块) ENDM 其中表达式的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错. 重复伪操作并不一定要在宏定义体内,例如: X=0 REPT 10 X=X+1 DB X ENDM 则汇编后产生 + DB 1 + DB 2 + DB 3 ... + DB 10 把字符A到Z的ASCII码填入数组TABLE CHAR='A' TABLE LABEL BYTE REPT 26 DB CHAR CHAR=CHAR+1 ENDM 用宏定义及重复伪操作把TAB,TAB+1,TAB+2,...,TAB+16的内容存入堆栈. 宏定义: PUSH_TAB MACRO K PUSH TAB+K ENDM 宏调用: I=0 REPT 17 PUSH_TAB % I I=I+1 ENDM 要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址. ARRAY LABEL WORD REPT 99 DW $+2 ENDM DW ARRAY 2.不定重复伪操作 (1)IRP伪操作 格式是: IRP dummy,<argument list> ... (重复块) ENDM 汇编程序把重复块的代码重复几次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定.自变量表必须用尖括号括起,它可以是常数,符号,字符串等. 例1: IRP X,<1,2,3,4,5,6,7,8,9,10> DB X ENDM 汇编后得: + DB 1 + DB 2 ... + DB 10 例2: IRP REG,<AX,BX,CX,DX> PUSH REG ENDM 汇编后得: + PUSH AX + PUSH BX + PUSH CX + PUSH DX (2)IRPC伪操作 格式是: IRPC dummy,string(或<string>) ... (重复块) ENDM IRPC和IRP类似,但自变量表必须是字符串.重复次数由字符串中的字符个数确定,每次重复用字符串中的下一个字符取代重复块中的哑元.例: 例1: IRPC X,0 1 2 3 4 5 6 7 DB X+1 ENDM 汇编后得: + DB 1 + DB 2 ... + DB 8 例2: IRPC K,A B C D PUSH K&X 汇编后展开形成: + PUSH AX + PUSH BX + PUSH CX + PUSH DX 三、条件汇编 汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作.条件伪操作的一般格式是: IFXX argument ... }自变量满足给定条件汇编此块 [ELSE] ... }自变量不满足给定条件汇编此块 ENDIF 自变量必须在汇编程序第一启遍扫视后就成为确定的数值.条件伪操作中的XX表示条件如下: IF expression 汇编程序求出表达式的值,如此值不为0则满足条件. IFE expression 如求出表达式的值为0则满足条件. IFDEF symbol 如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则 满足条件. IFNDEF symbol 如符号未定义或未通过EXTRN说明为外部符号则满足条件. IFB <argument> 如自变量为空则满足条件 IFNB<argument> 如自变量不为空则满足条件 IFIDN <argu-1>,<argu-2> 如果字符串<arg-1>和字符串<arg-2>相同,则满足条件. IFDIF <argu-1>,<argu-2> 如果字符串<arg-1>和字符串<arg-2>不相同,则满足条件. 条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也允许嵌套任意次. 例1:宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段. 宏定义: MAX MACRO K,A,B,C LOCAL 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 ENDIF OUT: ENDM 宏调用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R 宏展开: MAX 1,P + MOV AX,P +??0001: MAX 2,P,Q + MOV AX,P +??0002:CMP Q,AX + JLE ??0003 + MOV AX,Q +??0003: MAX 3,P,Q,R + MOV AX,P + CMP R,AX + JLE ??0004 + MOV AX,R +??0004:CMP Q,AX + JLE ??0005 + MOV AX,Q +??0005: 例2.宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令. 宏定义: GOTO MACRO L,X,REL,Y JFB <REL> JMP L ELSE MOV AX,X CMP AX,Y J&REL L ENDIF ENDM 宏调用: ... GOTO LOOP,SUM,NZ,15 ... GOTO EXIT ... 宏展开: ... + MOV AX,SUM + CMP AX,15 + JNZ LOOP ... + JMP EXIT 例3.宏定义可允许递归调用,此时条件伪操作可用来结束宏递归 宏指令POWER可以用来实现X和2N相乘.这只需对X左移N次可实现,可以设COUNT为递归次数的计数值,当该数与N相等时即可结束递归调用. 宏定义: POWER MACRO X,N SAL X,1 COUTN=COUT+1 IF COUNT-N POWER X,N ENDIF ENDM 宏调用: COUTN=0 POWER AX,3 宏展开: + SAL AX,1 + SAL AX,1 + SAL AX,1 例4.宏指令BRANCH产生一条转向X的转移指令.当它相对于X的距离小于128字节时产生JMP SHORT X;否则产生JMP NEAR PTR X(X必须位于该转移指令之后,即低地址区). 宏定义: BRANCH MACRO X IF ($-X) LT 128 JMP SHORT X ELSE JMP NEAR PTR X ENDIF ENDM 宏调用: BRANCH X 宏展开: 如X与BRANCH指令间的距离小于128时产生 + JMP SHORT X 否则产生: + JMP NEAR PTR X  
2/2 首页 上一页 1 2 |