汇编语言语句格式

程序中用得最多的是指令和有关数据定义的伪指令,这些语句由 4 项组成,格式如下:

1
2
3
[name]  operation  0perand [; comment]

[名字]    操作    操作数   [; 注释]

名字项是一个符号,可以是指令的标号,也可以是变量名。

操作项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。

操作数项由一个或多个表达式组成,它提供该操作所要求的操作数或相关信息。

注释项用来说明程序或语句的功能。

上面带方括号的两项是可选项。各项之间必须用‘空格’隔开。下面分别说明各项的表示方法。

一、名字项和操作项

  1. 名字项

    名字项用下列字符来表示:

    字母 A~Z

    数字 O~9

    专用字符 ?,·,@,-,$

    除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到 ·,则必须是第一个字符。

    名字项可以是标号或变量,用来表示本语句的符号地址。如果是指令的标号,后面跟冒号。

    作为一个地址符号,显然具有 3 个基本属性:段、偏移及类型。

    根据某变量的这三个基本属性值,在程序中才能访问到该变量。

    段属性,定义该地址符号的段起始地址,此值必须在一个段寄存器中。

    偏移属性,偏移地址是从段起始地址到定义该地址符号的位置之间的字节数。对于 16 位段是 16 位无符号数。

    类型属性,对于标号,用来指出该标号是在本段内引用还是在其他段中引用的。如是段内引用,则称为 NEAR,对于 16 位段,段地址不变,仅有 16 位的偏移地址。如是段外引用,则称为 FAR,对于 16 位段,既要表达 16 位的段地址,也要表达 16 位的偏移地址。

    对于变量,类型属性定义该变量所保留的字节数。如 BYTE(1 个字节)、WORD(2 个字节)、DWORD(4 个字节)、FWORD(6 个字节)、QWORD(8 个字节)、TBYTE(10 个字节),这一点在数据定义伪操作中已作了说明。

    作为一个地址符号,在同一个程序中,显然不能重复定义,即同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。

  2. 操作项

    操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言。对于伪指令,汇编程序将根据其所要求进行处理。

二、表达式和操作符

操作数项是指令的最复杂、最灵活的一项。操作数项由一个或多个表达式组成。对于指令,操作数项一般给出操作数地址,它们通常不超过两个。对于伪操作或宏指令,则给出它们所要求的参数。

操作数项可以是常数、寄存器、标号、变量。这些我们已经知道。操作数项还可以是表达式,而表达式是常数、寄存器、标号、变量与一些操作符(运算符)相组合的序列。

在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址,如是数值,这个表达式就是数字表达式,如是地址,这个表达式就是地址表达式。那么表达式有哪些操作符呢?下面介绍一些常用的操作符在表达式中的作用。

特别注意的是,表达式在汇编阶段起作用,只有正确的表达式才能通过汇编。

  1. 算术操作符

    算术操作符有 +,-,*,/ 和 MOD。其中 MOD 是指除法运算后得到的余数,如 7/5 的商为 1,而 7 MOD 5 为 2(余数)。

    要注意的是,算术操作符在表达式中的使用,其结果必须有明确的物理意义时才是有效的,下面举例说明。

    例 12 算术操作符的使用。

    设有如下定义:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ORG 0
    
    VAL=4
    
    DA1 DW 6,2,9,3
    
    DA2 DW 15,17,24
    
    COU=$-DA2
    

    上面定义的 VAL 是常数,我们无需确定它的位置就可以使用。DA1 和 DA2 是变量的符号地址,它们在内存中有确定的位置,我们只能根据它们的地址才能访问。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    MOV  AX,DA1*4     ; 错,地址乘或除,没有意义
    
    MOV  AX,DA1*DA2    ; 错,地址乘或除,没有意义
    
    MOV  AX,DA1+DA2    ; 错,地址相加,没有意义
    
    MOV  AX,BX+VAL     ; 错,BX+VAL须用指令实现
    
    MOV  AX,[BX+VAL]    ; 地址表达式,汇编成MOV AX,[BX+4]
    
    MOV  AX,DA1+VAL    ; 地址表达式,汇编成MOV AX,[4]
    
    MOV  AX,[DA1+VAL]   ; 地址表达式,汇编成MOV AX,[4]
    
    MOV  AX,VAL*4/2    ; 数字表达式,汇编成MOV AX,8
    
    MOV  AX,[VAL*4/2]   ; 数字表达式,汇编成MOV AX,8
    
    MOV  CX,DA2-DA1)/2  ; 得到DA1区数据个数,汇编成MOV CX,4
    
    MOV  BX,COU      ; 得到DA2区的字节数,汇编成MOV BX,6
    
  2. 逻辑与逻辑移位操作符

    逻辑操作符有 AND,OR,XOR 和 NOT;逻辑移位操作符有 SHL 和 SHR。它们都是按位操作的。注意逻辑与逻辑移位指令和逻辑与逻辑移位操作符的区别,逻辑与逻辑移位操作符只能用于数字表达式中。格式为:

    1
    
    expression 操作符 number
    

    例 13 逻辑操作符的使用。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    ARY DW  8
    
    VAL=4
    
    MOV  AX,BX AND 0FFH  ; 错,BX AND VAL须用指令实现
    
    MOV  AX,ARY AND 0FFH  ; 错,ARY AND VAL须用指令实现
    
    MOV  AX,VAL AND 0F0H    ; 汇编成MOV AX,0
    
    AND  AX,VAL OR 0F0H    ; 汇编成AND AX,0F4H
    

    例 14 移位操作符的使用。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    ARY DW  8
    
    VAL=4
    
    MOV  AX,BX SHL 2      ; 错,BX 左移须用指令实现
    
    MOV  AX,ARY SHL 2     ; 错,ARY 左移须用指令实现
    
    MOV  AX,VAL SHL 2     ; 汇编成MOV AX,10H
    
    MOV  AX,8 SHL 2      ; 汇编成MOV AX,20H
    
    MOV  AX,VAL SHL 15     ; 汇编成MOV AX,00H
    
  3. 关系操作符

    关系操作符用来对两个操作数的大小关系作出判断。六个关系操作符是 EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。关系操作符的两个操作数必须都是数字,或是同一段内的两个存储器地址。计算结果为逻辑值,如结果为真,表示为 FFFFH;结果为假,则表示为 0。

    例 15 关系操作符的使用。

    1
    2
    3
    4
    5
    6
    7
    
    VAL=4
    
    MOV  AX,BX GT 2      ; 错,BX 是否大于2须用指令实现判断
    
    MOV  AX,VAL GE 2      ; 汇编成MOV AX,FFFFH
    
    MOV  AX,8 LE VAL     ; 汇编成MOV AX,0
    
  4. 数值回送操作符

    主要有 TYPE,LENGTH,SIZE,OFFSET,SEG 等,下面分别说明。

    (1)TYPE

    格式:TYPE expression

    如果该表达式是变量,则汇编程序将回送该变量的以字节数表示的类型:DB 为 1,DW 为 2,DD 为 4,DF 为 6,DQ 为 8,DT 为 10。如果表达式是标号,则汇编程序将回送代表该标号类型的数值,NEAR 为 -1,FAR 为-2。如果表达式为常数则回送 0。

    (2)LENGTH

    格式:LENGTH variable

    变量用 DUP 复制的,则回送总变量数,其他为 1,但嵌套的 DUP 不计。所以,对于使用嵌套的 DUP 复制的数据不能据此得到正确的总变量数。

    (3)SIZE

    格式:SIZE variable

    变量用 DUP 复制的,则回送总字节数,其他为单个变量的字节数,但嵌套的 DUP 不计。所以,对于使用嵌套的 DUP 复制的数据不能据此得到正确的总字节数。

    (4)OFFSET

    格式:OFFSET variable或label

    回送变量或标号的偏移地址。

    (5)SEG

    格式:SEG variable 或 label

    回送变量或标号的段地址。

    例 16 数值回送操作符的使用。

    设有如下定义:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    ORG 0
    
    VAL=4
    
    ARR  DW 4 DUP3
    
    BUF  DW 4 DUP4 DUP3))
    
    DAT  DW 15,17,24
    
    STR  DB 'ABCDEF'
    

    汇编程序对下面的指令汇编结果为:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    MOV  AX,TYPE ARR      ; 汇编成MOV AX,2
    
    MOV  AX,LENGTH ARR    ; 汇编成MOV AX,4
    
    MOV  AX,LENGTH BUF    ; 汇编成MOV AX,4
    
    MOV  AX,LENGTH DAT    ; 汇编成MOV AX,1
    
    MOV  AX,SIZE ARR     ; 汇编成MOV AX,8
    
    MOV  AX,SIZE BUF     ; 汇编成MOV AX,8(不是32)
    
    MOV  AX,SIZE DAT     ; 汇编成MOV AX,2
    
    MOV  AL,SIZE STR     ; 汇编成MOV AX,1
    
    MOV  AX,OFFSET ARR    ; 不完整的机器指令
    
    MOV  BX,SEG ARR      ; 不完整的机器指令
    

在计算表达式时,根据操作符的优先级和括号,从左到右进行计算。下面给出操作符的优先级别,从高到低排列,有 11 级。

(1)在圆括号中的项,方括号中的项,结构变量(变量,字段),LENGTH,SIZE,WIDTH,MASK。

(2)名:(段取代)。

(3)PTR,OFFSET,SEG,TYPE,THIS 及段操作符。

(4)HIGH 和 LOW。

(5)乘法和除法:*,/,MOD,SHL,SHR。

(6)加法和减法:+,-。

(7)关系操作:EQ,NE.LT,LE,GT,GE。

(8)逻辑:NOT。

(9)逻辑:AND。

(10)逻辑:OR,XOR。

(11)SHORT。

由于表达式和操作符的规定较多,编程时不必一味追求程序的简练而使表达式复杂化,以免出错。

请参阅

(完)

comments powered by Disqus