等号伪指令(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,不会影响语句在运行时的执行顺序。相反,在汇编器预处理阶段,符号会根据汇编器对源代码处理的顺序来改变数值。
下一篇:计算数组和字符串长度
强力推荐阅读文章