条件汇编伪指令
条件汇编伪指令是告诉汇编程序:根据某种条件确定一组程序段是否加入到目标程序中。使用条件汇编伪指令的主要目的是:同一个源程序能根据不同的汇编条件生成不同功能的目标程序,增强宏定义的使用范围。
条件汇编伪指令与高级语言(如:C/C )的条件编译语句在书写形式上相似,在所起作用方面是完全一致的。
9.5.1 条件汇编伪指令的功能
条件汇编伪指令的一般格式如下:
|
IFnnnn |
条件表达式 |
语句组1 |
||
[ELSE |
||
|
语句组2] |
|
ENDIF |
其中:IFnnnn是表9.2中的伪指令,“[…]”内的语句是可选的。
条件汇编伪指令是在汇编程序把源程序转换成目标程序时起作用,其一般含义是:若条件汇编伪指令后面的“条件表达式”为真,那么,语句组1将被汇编;否则,语句组2将被汇编(如果含有ELSE伪指令)。
语句组1或语句组2内还可以包有条件汇编伪指令,这时,就形成了嵌套的条件汇编伪指令。一个嵌套的ELSE伪指令总是与最近的、还没有与其它ELSE伪指令相比配的IFnnnn伪指令相比配。
每条条件汇编伪指令的具体含义如表9.3所示。
表9.3 条件汇编伪指令及其功能一览表
伪指令 |
含义 |
IF exp |
若数值表达式exp的值不为0,则语句组1包含在目标文件中 |
IFE exp |
若数值表达式exp的值为0,则语句组1包含在目标文件中 |
IFDEF label |
若标号label有定义或被说明为EXTRN,则语句组1包含在目标文件中 |
IFNDEF label |
若标号label没有定义,也没被说明为EXTRN,则语句组1包含在目标文件中 |
IFB <参数> |
在宏引用时,若该形参没有相应的实参相对应,则语句组1包含在目标文件中 |
IFNB <参数> |
在宏引用时,若该形参没有相应的实参相对应,则语句组1包含在目标文件中 |
IFIDN <参数1>, <参数2> |
若参数1=参数2,则语句组1包含在目标文件中 |
IFDIF <参数1>, <参数2> |
若参数1≠参数2,则语句组1包含在目标文件中 |
IF1 |
若汇编程序在第一遍扫描时,则语句组1包含在目标文件中 |
IF2 |
若汇编程序在第二遍扫描时,则语句组1包含在目标文件中 |
9.5.2条件汇编伪指令的举例
例9.14 编写一个可用DOS或BIOS功能调用输入字符的宏定义。
解: |
||||
|
方法1:使用条件汇编伪指令IF |
|||
INPUT |
MACRO |
|||
IF |
DOS |
;当符号DOS不为0时,则使用DOS的功能调用 |
||
MOV AH, 1H |
||||
INT 21H |
||||
ELSE |
;否则,将使用BIOS的功能调用 |
|||
|
MOV AH, 10H |
|||
INT 16H |
||||
ENDIF |
||||
ENDM |
在引用宏INPUT时,汇编程序会根据DOS是否为0来生成调用不同输入功能的程序段。
|
方法2:使用条件汇编伪指令IFDEF |
|||
INPUT |
MACRO |
|||
IFDEF |
DOS |
;当定义了DOS,则使用DOS的功能调用 |
||
MOV AH, 1H |
||||
INT 21H |
||||
ELSE |
;否则,将使用BIOS的功能调用 |
|||
|
MOV AH, 10H |
|||
INT 16H |
||||
ENDIF |
||||
ENDM |
在引用宏INPUT时,汇编程序会根据符号DOS是否已定义来生成调用不同输入功能的程序段。
例9.15 编写一个可用功能调用输入字符的宏定义。
解: |
||||
|
READCH |
MACRO char |
||
MOV |
AH, 1H |
|||
INT |
21H |
;接受一个字符,并存入AL中 |
||
IFNB |
<char> |
;若参数char有实参与之对应 |
||
IFDIF <char>, <AL> |
;若参数char≠AL,则把所输入字符保存到实参中 |
|||
MOV char, AL |
||||
ENDIF |
||||
ENDIF |
||||
ENDM |
9.6 宏的扩充
MASM 6.11编程系统对宏定义及其相关语句进行了一定程度的扩充。虽然这些扩充给编程带来了一些方便,但它们不一定能被其它的汇编语言编程系统所接受,所以,程序员在使用这些方便的扩充功能时,要注意到可能带来的限制。
下面介绍MASM 6.11编程系统对宏及其相关语句的扩充。
9.6.1 宏定义形式
在MASM 6.11编程系统中,其宏定义的一般形式如下:
对上述宏定义的说明与9.1.1节中的说明完全一致,其需要增加的说明如下: