汇编语言等号=伪指令

等号伪指令(equal-sign directive)把一个符号名称与一个整数表达式连接起来,其语法如下:

name = expression

通常,表达式是一个 32 位的整数值。当程序进行汇编时,在汇编器预处理阶段,所有出现的 name 都会被替换为 expression。假设下面的语句出现在一个源代码文件开始的位置:

COUNT = 500

然后,假设在其后 10 行的位置有如下语句:

mov eax, COUNT

那么,当汇编文件时,MASM 将扫描这个源文件,并生成相应的代码行:

mov eax, 500

为什么使用符号?

程序员可以完全跳过 COUNT 符号,简化为直接用常量 500 来编写 MOV 指令,但是经验表明,如果使用符号将会让程序更加容易阅读和维护。

设想,如果 COUNT 在整个程序中出现多次,那么,在之后的时间里,程序员就能方便地重新定义它的值:

COUNT = 600

假如再次对该源文件进行汇编,则所有的 COUNT 都将会被自动替换为 600。

当前地址计数器

最重要的符号之一被称为当前地址计数器(current location counter),表示为 $。例如,下面的语句声明了一个变量 selfPtr,并将其初始化为该变量的偏移量:

selfPtr DWORD $

键盘定义

程序通常定义符号来识别常用的数字键盘代码。比如,27 是 Esc 键的 ASCII 码:

Esc_key = 27

在该程序的后面,如果语句使用这个符号而不是整数常量,那么它会具有更强的自描述性。

使用
mov al,Esc_key ;好的编程风格
而非
mov al,27      ;不好的编程风格

使用DUP操作符

数据定义》一节说明了怎样使用 DUP 操作符来存储数组和字符串。为了简化程序的维护,DUP 使用的计数器应该是符号计数器。

在下例中,如果已经定义了 COUNT,那么它就可以用于下面的数据定义中:

array dword COUNT DUP(0)

重定义

用“=”定义的符号,在同一程序内可以被重新定义。下例展示了当 COUNT 改变数值后,汇编器如何计算它的值:

COUNT = 5
mov al,COUNT ; AL = 5
COUNT = 10
mov al,COUNT ; AL = 10
COUNT = 100
mov al,COUNT ; AL = 100

符号值的改变,例如 COUNT,不会影响语句在运行时的执行顺序。相反,在汇编器预处理阶段,符号会根据汇编器对源代码处理的顺序来改变数值。