ITEEDU

那么对于给出的这个小程序而言,有没有什么方法能使它的适应性强一些呢?最好能让它"识相"一些,只要告诉它是"boy"还是"girl",再把它重新编译一次它就能显示出相应的问候语,这是最好不过了。做到这一点并不困难,只要把程序修改成下面这个样子就可以了:

CHILD.ASM
        girl  equ       1	;告之编译程序现在要把程序送给一位"Girl"
			
        code  segment
              assume    cs:code
              org       100h
        main  proc      near
              mov       ah,09	;显示问候语
              mov       dx,offset msg
              int       21h
              int       20h	;结束进程
			
              IF        girl		;如果将程序送给"Girl",则问候语使用下述
         msg  db        'Hello	,cowgirl!',0dh,0ah,07h,24h	;字符串
			
              ELSE      ;否则使用以下的字符串
			
         msg  db        'Hello	,cowboy!',0dh,0ah,07h,24h
			
              ENDIF     ;条件判断部分结束
        main  endp
        code  ends
              end       main

程序中新增的"IF"、"ELSE"和"ENDIF"就是用于完成条件汇编的伪指令,这三条伪指令之间有两部分源程序,"IF"下面的源程序把字符串MSG定义成"Hello,cowgirl","ELSE"下面的程序段将MSG定义成"Hello,cowboy"。这样一来编译程序就会有两种选择,到底编译哪块程序就要依条件来定。

具体来说,当"IF"伪指令之后的表达式值为"1"时,则"IF"下面的程序段被编译,"ELSE"下面的程序段舍去。若"IF"之后的表达式为"0",则"ELSE"下面的程序段将被编译,而"IF"下面的程序段被舍去。

在这个程序之中我们一开始就定义了"GIRL EQU 1",很明显这个程序只能输出"Hello,cowgirl!"了,因为"Hello,cowboy!"根本没有被编译。如果需要把这个程序给男孩子,只要把源程序开始修改为"GIRL EQU 0"就可以了。

采用条件汇编技术的一个优点就是能加强程序的可移植性,比如有两台同一型号的PC电脑,结构几乎完全相同,只是一台使用VGA显示卡而另一台使用EGA卡。为这样的两台电脑编写程序就可以采用条件汇编技术,把涉及显示功能的程序段搞成下面这样:

IF		VGA
		......(用于VGA卡的程序段)
ELSE
		......(用于EGA卡的程序段)
ENDIF

当使用EGA显示卡的用户拿到这样的源程序之后就无需自己对程序进行修改了。

类似的情况还有一些,比如TASM编译程序支持的伪指令与MASM早期版本略有不同,为使源程序能适应不同的编译程序,采用条件汇编技术也是很有必要的。

条件汇编还有其它一些用于判断条件的伪指令,我们讨论的"IF"是最简单的一个,其它的伪指令都列在表10-1中,以供大家研究参考,限于篇幅,本节不再详细讨论。

表11-1 条件汇编伪指令
伪指令 说明
IF 表达式 求出表达式的值,如果此值不是0则编译其后的程序段
IFE 表达式 与"IF"相反,如果表达式的值为0则编译其后的程序段
IFDEF 符号 如果符号在源程序中有定义,则编译其后的程序段
IFNDEF 符号 与"IFDEF"相反,如果符号在源程序中没定义则条件成立
IFB 自变量 如果自变量为空则条件成立
IFNB 自变量 与"IFB"相反,如果自变量不空则条件成立
IFIDN 字符串1,字符串2 如果两个字符串相同,则条件成立
IFDIF 字符串1,字符串2 如果两个字符串相同,则条件成立