你的位置: 首页 > 通信技术 > 汇编语言

条件汇编

2016-10-24 13:53:07 | 人围观 | 评论:

汇编后展开形成 :
  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




标签:

相关内容推荐: