购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.2 语句格式

像其他程序设计语言一样,汇编语言对其语句格式、程序结构以及开发过程等也有相应的要求。

汇编语言源程序由语句序列构成,每条语句一般占一行,每行不超过132个字符(从MASM 6.0开始每行不超过512个字符)。语句有以下两种,一般都由分隔符分成的4个部分组成。

● 表示处理器指令的语句称为执行性语句。执行性语句汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体。执行性语句的格式如下:

● 表示汇编程序命令的语句称为说明性(指示性)语句。说明性语句指示源程序如何汇编、变量如何定义、过程如何设置等。相对于真正的处理器指令(也称为真指令、硬指令),汇编程序命令也称为伪指令(Pseudoinstruction)、指示符(Directive)。说明性语句的格式如下:

1.标号和名字

在执行性语句中,冒号前的标号表示处理器指令在主存中的逻辑地址,主要用于指示分支、循环等程序的目的地址,可有可无。说明性语句中的名字可以是变量名、段名、子程序名等,反映变量、段和子程序等的逻辑地址。标号采用冒号分隔处理器指令,名字采用空格或制表符分隔伪指令,据此也可以区分两种语句。

标号和名字是符合汇编程序语法的用户自定义的标识符(Identifier)。标识符(也称为符号,Symbol)最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,但不能以数字开头(与高级程序设计语言一样)。在一个源程序中,用户定义的每个标识符必须是唯一的,而且不能是汇编程序采用的保留字。保留字(Reserved Word)是编程语言本身需要使用的各种具有特定含义的标识符,也称为关键字(Key Word),汇编程序中的保留字主要有处理器指令助记符、伪指令助记符、操作符、寄存器名以及预定义符号等。

例如,msg、var2、buf、next、again都是合法的用户自定义标识符。而8var、eax、mov、byte则是不符合语法(非法)的标识符,原因是:8var以数字开头,其他是保留字(eax是寄存器名、mov是指令助记符、byte是伪指令助记符或操作符)。

默认情况下,MASM汇编程序不区分包括保留字在内的标识符的字母大小写。换句话说,汇编语言是大小写不敏感的。例如,寄存器名EAX还可以写成eax、Eax等,而变量名msg还可以以Msg、MSG等形式出现。本书的原则是:程序中一般采用小写字母形式,新引出指令进行格式介绍时助记符采用大写字母形式,功能注释、文字说明通常采用大写字母形式。

用户自定义标识符时,应尽量具有描述性并易于理解,一般不建议以特殊符号开头,因为特殊符号没有含义,而且常被编译(汇编)程序所使用,例如,C语言编译程序在内部为函数增加“_”前缀,MASM大量使用“@”作为预定义符号的前缀。如果不确信标识符可用,就不使用。一个简单的规则是:以字母开头,后跟字母或数字。

2.助记符

助记符(Mnemonics)是帮助记忆指令的符号,反映指令的功能。处理器指令助记符可以是任何一条处理器指令,表示一种处理器操作。同一系列的处理器指令随版本的升级会增加,不同系列的处理器的指令系统不尽相同。伪指令助记符由汇编程序定义,表示一个汇编过程中的命令,随着汇编程序版本升级,伪指令会增加,功能也会增强。

例如,数据传送指令的助记符是MOV。调用子程序(对应高级语言的函数或过程)的处理器指令是调用指令,其助记符是CALL。

汇编语言源程序中使用最多的字节变量定义伪指令,其助记符是DB(取自Define Byte)或BYTE,功能是在主存中分配若干的存储空间,用于保存变量值,该变量以字节为单位存取。例如,可以用DB伪指令定义一个字符串,并使用变量名MSG表示其在主存中的逻辑地址:

字符串最后的“0”表示字符串结束[C和C++语言中隐含用NULL(即0)作为字符串结尾]。变量名MSG包含段基地址和偏移地址,例如,可以用一个MASM操作符OFFSET获得其偏移地址,保存到EAX寄存器。汇编语言指令如下:

MASM操作符(Operator)是对常量、变量、地址等进行操作的关键字。例如,进行加减乘除运算的操作符(也称运算符)与高级语言一样,依次是符号+、-、*和/。

3.操作数和参数

处理器指令的操作数表示参与操作的对象,可以是一个具体的常量,也可以是保存在寄存器中的数据,还可以是一个保存在存储器中的变量。在双操作数的指令中,目的操作数写在逗号前,用来存放指令操作的结果;对应地,逗号后的操作数就称为源操作数。

例如,在指令“MOV EAX,OFFSET MSG”中,EAX是寄存器形式的目的操作数,OFFSET MSG是常量形式的源操作数,经汇编后转换为一个具体的偏移地址。

伪指令的参数可以是常量、变量名、表达式等,可以有多个,参数之间用逗号分隔。例如,在“'Hello,Assembly!',13,10,0”示例中,参数包括用单引号表达的字符串“Hello,Assembly!”、常量13和10(这两个常量在ASCII码表中分别表示回车和换行控制字符,其作用相当于C语言中的“\n”)、一个数值0(作为字符串结尾)。

4.注释和分隔符

在汇编语言语句中,分号后的内容是注释,它通常是对指令或程序片段功能的说明,是为了便于程序阅读而加上的,不是必须有的。必要时,一个语句行也可以由分号开始作为阶段性注释。汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理。建议大家养成书写注释的良好习惯。

汇编语言语句的4个组成部分要用分隔符分开。标号后的冒号、注释前的分号以及操作数间和参数间的逗号都是规定使用的分隔符,其他部分通常采用空格或制表符作为分隔符。多个空格和制表符的作用与一个相同。另外,MASM还支持续行符“\”,表示本行内容与上一行内容属于同一个语句。注释可以使用英文书写,在支持汉字的编辑环境下也可以使用汉字进行程序注释,但注意分隔符都必须使用英文标点,否则无法通过汇编。

良好的语句格式有利于编程,尤其是便于阅读源程序。在本书的汇编语言源程序中,标号和名字从首列开始书写,通过制表符对齐各个语句行的助记符,助记符之后用空格分隔操作数和参数部分(对于多个操作数和参数,按照语法要求使用逗号分隔),再利用制表符对齐注释部分。 ZNjsxZC5J+yUygJlGPYB3U3e507+AQpUuU3E/kudvAPy4DEIITjuS7xQR0AJwQW5

点击中间区域
呼出菜单
上一章
目录
下一章
×