第三章 汇编语言基本语法
3.1 汇编语言的语句和源程序组织
一个汇编语盲源程序经过汇编程序(Assembler)的汇编(即翻译)才能生成一个目标程序(即机器语言程序)。汇编程序是一台计算机的系统软件之一,它提供下组成汇编语言源程序的语法规则.所以用汇编语言编制程序时,必须事先熟悉相应的汇编程序.支持Intel8086/8088系列微机的汇编程序,现有ASM,MASM,TASM,OPTASM.其中ASM是仅有基本汇编语言的“小汇编”,它不支持高级宏汇编语言功能。MASM(Macroassembler)是美国Micro-soft公司开发较早的宏汇编程序,它不仅含有ASM的全部功能,而且增加了宏指令,结构,记录等高级宏汇编语官功能。TASM是Turbo Assembler,在性能上与MASM相同,但汇编速度较MASM快。而OPTASM(Optimizing Assembler)是目前汇编速度最快的一种优化宏汇编程序。
同高级语言程序一样,语句(Statements)乃是汇编语言程序的基本组成单位。一个汇编语言源程序中有三种基本语句;指令语句,伪指令语句和宏指令语句(或称宏调用语句)。
3.1.1 语句种类
指令语句:指令系统中每条指令都属于此类。它在汇编时会产生目标代码,对应着CPU 的一种作;
伪指令语句:主要用来指示汇编程序如何进行汇编工作的,但它不产生目标代码。
3.1.2 语句格式
每一条指令语句在汇编时都要产生一个可供机器执行的机器目标代码,所以这种语句又叫可执行语句。
语句格式 包括指令语句格式和伪指令语句格式。指令语句、伪指令语句的格式相似,都由四部分组成。语句格式列表如下:
指令语句:[标号:] 指令助记符 [操作数] [;注释];
指令语句格式如图3.1
图3.1:指令语句格式
伪指令语句:[名字 ] 伪指令助记符 [操作数] [;注释]。
伪指令语句格式 如图3.2
图3.2:伪指令语句格式
不同点:指令语句中的标号后面跟有冒号(:),而在伪指令中的名字后面没有冒号,这是两种语句格式上的不同点。
下面对语句中各域进行说明:
标号,名字域 该域主要用来定义标号、名字,以便在操作数域中引用它们。标号和名字都是由标识符组成的。标识符可由最多31个字母、数字和特殊字符所组成它必须以字母或特殊字符开始。标识符的组成规则如下:
①字符个数为1~31个;
②标识符的第一个字符必须是字母,问号“?”,“@”或下划线‘_’这四种字符中的一个;
③从第二个字符开始,可以是字母,数字、?、@或_;
④不能使用属于系统专用保留字(Reserved word)。保留字主要有CPU中各寄存器名(如AX,CS),指令助记符(如MOV,ADD),伪指令(如SEGMENT,DB),表达式中的运算符(如GE,EQ)和属性操作符(如PTR,OFFSET,SEG)等。
例: 1、AXYZ1,COUNT_DONE,.FOUND,@ATT都是合法的标识符;
2、?,3AP,THIS NODE都是不合法的标识符。
指令助记符域 又称作操作码域,它是语句中唯一必不可少的部分。 指令语句中的助记符规定这个语句中的操作类型;伪指令语句中的助记符规定这个语句中的伪操作功能。
操作数域 它用来存放助记符要求的操作数,使之能实现预期的目的。指令语句可能有一个、两个或没有操作数,而伪指令是否需要操作数,需要何种操作数,随伪操作命令不同而不同。可充当操作数的有常量、变量、标号、寄存器和表达式等。
注释域 注释以分号(;)开头,用来说明语句或程序功能和含义的符号序列。它增加了程序的可读性,为修改、调试、交流提供了方便。
3.1.3 源程序组织
汇编(ASM)和宏汇编(MASM)的源程序除了在使用某些伪指令上有些区别外,在源程序的书写结构形式上是完全相同的。
数据段结构:
数据段名 SEGMENT
(用变量定义预置的数据空间)
数据段名 ENDS
例如:DATA SEGMENT
X DW 1520
Y DW 4327
Z DW 3215
RESULT DW ?
DATA ENDS
堆栈段结构:
堆栈段名 STACK
(用变量定义预置的堆栈空间)
堆栈段名 ENDS
例如:STACK SEGMENT PARA STACK 'STACK'
STACK DB 20 DUP(?)
TOP EQU LENGTH STAPN
STACK ENDS
代码段结构:
代码段名 SEGMENT
ASSUME 定义的寻址关系
过程名 PROC
(程序段)
过程名 ENDP
代码段名 ENDS
过程名或起始标号
例如:CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
START:MOV AX,X
MOV BX,Y
ADD AX,BX
SUB AX,Z
MOV RESULT,AX
RET
MAIN ENDP
CODE ENDS
END MAIN
说明:上边是源程序的可能形式,但完全可以满足一般的要求。每个段都以"SEGMENT"语句开始,以"ENDS"语句结束。任何一个源程序至少必须有一个代码段和一条作为源程序结束的伪指令END。根据程序本身要求,数据段可以有,也可以没有。堆栈段如果没有,连接(LINK)时将产生一个警告性的错误:
Warning:No STACK Segment
There was 1 error detected
这并不影响用户程序的正常运行,因为用户可以使用系统堆栈。当然用户如果设置了自己的堆栈段,使用起来会更方便些。一个源程序可以有多个数据段、多个代码段或多个堆栈段,它们可由相应的伪指令以适当形式进行组合,各个段在源程序中的顺序可以任意。