汇编后展开形成 : 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX 汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外 , 这时就用到条件伪操作 , 条件汇编伪指令在汇编过程中,根据条件决定汇编的语句。格式: IFxx 表达式 ; 满足,汇编分支语句体 1 分支语句体 1 [ ELSE ; 不满足,汇编分支语句体 2 分支语句体 2 ] ENDIF ; 条件汇编结束 自变量必须在汇编程序第一遍扫后就成为确定的数值 . 条件伪操作中的 XX 表示条件如下 : IF expression :汇编程序求出表达式的值 , 如此值不为 0 则满足条件 . IFE expression : 如求出表达式的值为 0 则满足条件 . IFDEF symbol :如符号已在程序中定义 , 或者已用 EXTRN 伪操作说明该符号是在外部定义的 , 则满足条件 . IFNDEF symbol :如符号未定义或未通过 EXTRN 说明为外部符号则满足条件 . IFB : 如自变量为空则满足条件 IFNB : 如自变量不为空则满足条件 IFIDN , :如果字符串 和字符串 相同 , 则满足条件 . IFDIF , :如果字符串 和字符串 不相同 , 则满足条件 . 上述 IF 和 IFE 的表达式中可以使用关系操作符 EQ , NE , LT , LE , GT 和 GE 。如: IF 表达式 1 EQ 表达式 2 等。 条件伪操作可以用在宏定义体内 , 也可以用在宏定义体外,也允许嵌套任意次。 例 : 宏指令 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 1 MOV AX,P 1 ??0001: MAX 2,P,Q 1 MOV AX,P 1 ??0002:CMP Q,AX 1 JLE ??0003 1 MOV AX,Q 1 ??0003: MAX 3,P,Q,R 1 MOV AX,P 1 CMP R,AX 1 JLE ??0004 1 MOV AX,R 1 ??0004:CMP Q,AX 1 JLE ??0005 1 MOV AX,Q 1 ??0005: 宏定义: PDATA MACRO NUM IF NUM LT 100 ;; 如果 num < 100 ,则汇编如下语句 DB NUM DUP(?) ELSE ;; 否则,汇编如下语句 DB 100 DUP(?) ENDIF ENDM 宏调用: … PDATA 12 … PDATA 102 宏展开: … DB 12 DUP(?) … DB 100 DUP(?) 例 : 宏指令 PDATA 根据实参不同时产生不同的程序段 . 例:宏指令 GOTO L,X,REL,Y( 其中 REL 可以是 Z,NZ,L,NL 等 ) 可以根据不同情况产生无条件转移指令或比较和条件转移指令 . 宏定义 : 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 EXIT ... 宏展开 : ... 1 MOV AX,SUM 1 CMP AX,15 1 JNZ LOOP ... 1 JMP EXIT 宏定义可允许递归调用 , 此时条件伪操作可用来结束宏递归。 例:宏指令 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 宏展开 : 1 SAL AX,1 1 SAL AX,1 1 SAL AX,1 例: 宏指令 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 时产生 1 JMP SHORT X 否则产生 : 1 JMP NEAR PTR X 宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方便,灵活运用它们可以编写出非常良好的源程序来。 汇编系统中有些以圆点起始的伪指令(如 .startup 、 .exit 等)实际上是一种宏结构。 宏结构的作用 dstring MACRO string ;; 定义字符串 db '&string&',0dh,0ah,'$' ENDM mainbegin MACRO dsseg ;; 设置数据段地址 mov ax,dsseg mov ds,ax ENDM dispmsg MACRO message mov dx,offset message mov ah,09h int 21h ENDM 例 : mainend MACRO retnum ;; 返回 DOS ,可不带参数 ifb mov ah,4ch ;; 没有参数 else mov ax, 4c 00h+(retnum AND 0ffh) ;; 有参数 endif int 21h ENDM .model small .stack 256 .data msg1 equ this byte dstring msg2 equ this byte dstring .code start: mainbegin @data ; 建立 DS 内容 dispmsg msg1 ; 显示 msg1 字符串 dispmsg msg2 ; 显示 msg2 字符串 mainend ; 返回 DOS end start |