多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 等号伪指令 等号伪指令(equal-sign directive)把一个符号名称与一个整数表达式连接起来,其语法如下: ``` name = expression ``` 通常,表达式是一个 32 位的整数值。当程序进行汇编时,在汇编器预处理阶段,所有出现的 name 都会被替换为 expression。假设下面的语句出现在一个源代码文件开始的位置: ``` COUNT = 500 ``` 然后,假设在其后有如下语句: ``` mov eax, COUNT ``` 那么,当汇编文件时,MASM 将扫描这个源文件,并生成相应的代码行: ``` mov eax, 500 ``` ### 当前地址计数器 最重要的符号之一被称为当前地址计数器(current location counter),表示为 $。例如,下面的语句声明了一个变量 selfPtr,并将其初始化为该变量的偏移量: selfPtr DWORD $ ### 键盘定义 程序通常定义符号来识别常用的数字键盘代码。比如,27 是 Esc 键的 ASCII 码: ``` Esc_key = 27 ``` 在该程序的后面,如果语句使用这个符号而不是整数常量,那么它会具有更强的自描述性。 ``` 使用 mov al,Esc_key ;好的编程风格 而非 mov al,27      ;不好的编程风格 ``` ### 使用DUP操作符 DUP 操作符使用一个整数表达式作为计数器,为多个数据项分配存储空间。在为字符串或数组分配存储空间时,这个操作符非常有用,它可以使用初始化或非初始化数据 ``` BYTE 20 DUP ( 0 ) ;20 个字节,值都为 0 BYTE 20 DUP ( ? ) ;20 个字节,非初始化 BYTE 4 DUP ( "STACK" ) ; 20 个字节: ``` 在下例中,如果已经定义了`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`,不会影响语句在运行时的执行顺序。相反,在汇编器预处理阶段,符号会根据汇编器对源代码处理的顺序来改变数值。 ## 汇编语言EQU伪指令 EQU 伪指令把一个符号名称与一个整数表达式或一个任意文本连接起来,它有 3 种格式: ``` name EQU expression name EQU symbol name EQU ``` * 第一种格式中,expression 必须是一个有效整数表达式。 * 第二种格式中,symbol 是一个已存在的符号名称,已经用 = 或 EQU 定义过了。 * 第三种格式中,任何文本都可以岀现在内。当汇编器在程序后面遇到 name 时,它就用整数值或文本来代替符号。 在定义非整数值时,EQU 非常有用。比如,可以使用 EQU 定义实数常量: ``` PI EQU ``` 【示例 1】下面的例子将一个符号与一个字符串连接起来,然后用该符号定义一个变量: ``` pressKey EQU <"Press any key to continue...", 0> .data prompt BYTE pressKey ``` 【示例 2】假设想定义一个符号来计算一个 10 x 10 整数矩阵的元素个数。现在用两种不同的方法来进行符号定义,一种用整数表达式,一种用文本。然后把两个符号都用于数据定义: ``` matrix1 EQU 10 * 10 matrix2 EQU <10 * 10> .data M1 WORD matrix1 M2 WORD matrix2 ``` 汇编器将为 M1 和 M2 生成不同的数据定义。计算 matrix1 中的整数表达式,并将其赋给M1。而 matrix2 中的文本则直接复制到 M2 的数据定义中: ``` M1 WORD 100 M2 WORD 10 * 10 ``` >与 = 伪指令不同,在同一源代码文件中,用 EQU 定义的符号不能被重新定义。这个限制可以防止现有符号在无意中被赋予新值。 ## 汇编语言TEXTEQU伪指令 TEXTEQU 伪指令,类似于 EQU,创建了文本宏(text macro)。它有 3 种格式:第一种为名称分配的是文本;第二种分配的是已有文本宏的内容;第三种分配的是整数常量表达式: ``` name TEXTEQU name TEXTEQU textmacro name TEXTEQU %constExpr ``` 例如,变量 prompt1 使用了文本宏 continueMsg: ``` continueMsg TEXTEQU <"Do you wish to continue (Y/N)?"> .data prompt1 BYTE continueMsg ``` 文本宏可以相互构建。如下例所示,count 被赋值了一个整数表达式,其中包含 rowSize。然后,符号 move 被定义为 mov。最后,用 move 和 count 创建 setupAL: ``` rowSize = 5 count TEXTEQU %(rowSize * 2) move TEXTEQU <mov> setupAL TEXTEQU <move al,count> ``` 因此,语句 ``` setupAL ``` 就会被汇编为 ``` mov al,10 ``` >用 TEXTEQU 定义的符号随时可以被重新定义。 参考:http://c.biancheng.net/view/3467.html http://c.biancheng.net/view/3477.html http://c.biancheng.net/view/3481.html http://c.biancheng.net/view/3484.html