那么对于给出的这个小程序而言,有没有什么方法能使它的适应性强一些呢?最好能让它"识相"一些,只要告诉它是"boy"还是"girl",再把它重新编译一次它就能显示出相应的问候语,这是最好不过了。做到这一点并不困难,只要把程序修改成下面这个样子就可以了:
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中,以供大家研究参考,限于篇幅,本节不再详细讨论。
伪指令 | 说明 |
IF 表达式 | 求出表达式的值,如果此值不是0则编译其后的程序段 |
IFE 表达式 | 与"IF"相反,如果表达式的值为0则编译其后的程序段 |
IFDEF 符号 | 如果符号在源程序中有定义,则编译其后的程序段 |
IFNDEF 符号 | 与"IFDEF"相反,如果符号在源程序中没定义则条件成立 |
IFB 自变量 | 如果自变量为空则条件成立 |
IFNB 自变量 | 与"IFB"相反,如果自变量不空则条件成立 |
IFIDN 字符串1,字符串2 | 如果两个字符串相同,则条件成立 |
IFDIF 字符串1,字符串2 | 如果两个字符串相同,则条件成立 |