• 汇编学习笔记48


    四、条件汇编

    条件汇编语句提供根据某种条件决定是否汇编某段源程序的功能。

    在程序中使用条件汇编语句的主要目的是 (1) 通过在条件汇编前或条件汇编时改变某种条件,从而方便地产生功能不同的程序 (2) 增加宏定义的能力

    (一) 条件汇编伪指令

    条件汇编语句的一般格式如下:

    IFxxx 条件表达式

      语句组1

    ELSE

      语句组2

    ENDIF

    IFxxx是条件伪指令助词符的一般形式,其中xxx表示构成条件伪指令助记符的其它字符。

    完整的条件伪指令助记符如下:

    IF IFE IFDEF IFNDEF IF1 IF2 IFB IFNB IFIDN IFDIF

    结束语句是ENDIF

    1. 伪指令IF和IFE

    伪指令IF的一般格式如下:

    IF 表达式

    <语句序列>

    ENDIF

    如果表达式的值不等于0,则条件满足,即条件为真

    伪指令IFE的一般格式如下:

    IFE 表达式

    <语句序列>

    ENDIF

    如果表达式的值等于0,则条件满足,IFE伪指令的条件与伪指令IF的条件相反

    例1:

    在下面的条件语句中,如果MFLAG的值不为0, 即条件满足,那么就汇编语句组1, 否则汇编语句组2

    IF MFLAG

      MOV AH, 0

      INT 16H

    ELSE

      MOV AH, 1

      INT 21H

    ENDIF

    例2:

    在下面的条件语句中,条件表达式是一个关系表达式

    IF PORT EQ 0

    PORTADDR = 3F8H

    IVECIH = 0BH

    IMASKV = 11110111B

    ENDIF

    例3:

    如下定义的宏SHIFT, 使用了重复块和结束宏扩展的伪指令EXITM

    SHIFT MACRO OP, N

    CONT=0

    REPT N

      SHL OP, 1

      CONT=CONT+1

      IF CONT GE N

       EXITM

      ENDIF

    ENDM

    INC OP

    ENDM

    SHIFT AX, 1

    + SHL, AX, 1

    1 INC AX

    SHIFT BX, 3

    1 SHL BX, 1

    1 SHL BX, 1

    1 SHL BX, 1

    2 INC BX

    2. 伪指令IFDEF和IFNDEF

    伪指令IFDEF一般格式如下:

    IFDEF 符号

    <语句序列>

    ENDIF

    如果符号已被定义或被说明为外部符号,则条件满足,即条件为真。

    伪指令IFNDEF格式如下:

    IFNDEF 符号

    <语句序列>

    ENDIF

    如果符号未定义或未被说明成外部符号,则条件满足,即条件为真

    伪指令IFDEF和IFNDEF条件相反。

    3. 伪指令IF1, IF2

    伪指令IF1的格式如下:

    IF1

    <语句序列>

    ENDIF

    若是第一遍扫描,则条件为真。

    伪指令IF2的格式如下:

    IF2

    <语句序列>

    ENDIF

    若是第二遍扫描,则条件为真

    例:

    宏BRAN产生一条转向X的转移指令, 当它相对于X的距离小于128字节时产生JMP SHORT X否则产生JMP NEAR PTR X。 (X必须位于该转移指令之后,即低地址区)

    BRAN MACRO X

    IF ($ – x) LT 128

      JMP SHORT X

    ELSE

      JMP NEAR PTR X

    ENDIF

    ENDM

    宏调用:

    BRAN X

    宏展开:

    如果X与BRAN指令之间的距离小于128时

    + JMP SHORT X

    否则

    + JMP NEAR PTR X

    例:

    宏指令GOTO L, X, REL, Y(其中REL可以是Z, NZ, L, NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令

    GOTO MACRO L, X, REL, Y

    IFB <REL>

      JMP L

    ELSE

      MOV AX, X

      CMP AX, Y

      J&REL L

    ENDIF

    ENDM

    宏调用:

    GOTO LOOP, SUM, NZ, 15

    + MOV AX, SUM

    + CMP AX, 15

    + JNZ LOOP

    GOTO EXIT

    + JMP EXIT

    宏调用允许使用递归调用,此时一定要有条件语句结束递归调用。

  • 相关阅读:
    指针型函数与函数型指针 -2021.08.04
    Ubuntu18.04 NAT模式下配置静态IP地址 -2020.11.09
    Linux编译内核 Ubuntu18.04 -2020.11.04
    以PING为例,利用Wireshark深入理解网络层、数据链路层的工作原理 -2020.10.30
    Ubuntu18.04虚拟机的安装
    UNIX/Linux系统中的文件属性
    【计算机四级嵌入式】内存管理
    利用预编译解决C/C++重复定义的错误 -2020.09.13
    使用镜像安装cygwin、gcc并配置CLion IDE -2020.09.12
    Android Studio 4.0.1 找不到R.java 2020.09.08
  • 原文地址:https://www.cnblogs.com/hailong/p/1943464.html
Copyright © 2020-2023  润新知