汇编语言程序格式
1、汇编程序功能
在计算机上运行汇编语言程序的步骤是:
用编辑程序建立ASM源文件
用MASM程序把ASM文件转换成OBJ文件
用LINK程序把OBJ文件转换成EXE文件
用DOS命令直接键入文件名就可执行该程序
汇编程序的主要功能是:
检查源程序
测出源程序中的语法错误,并给出出错信息
产生源程序的目标程序,并给出列表文件(同时列出汇编语言和机器语言的文件,称为LST文件)
展开宏指令
2、伪操作
汇编语言程序的语句除指令以外还可以由伪操作和宏指令组成。伪操作又称为伪指令,它们不像机器指令那样是在程序运行期间由计算机执行的,而是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能
2.1、处理器选择伪操作
汇编程序把ASM源文件汇编成OBJ目标文件时,需要选择一种指令系统把汇编指令翻译成机器指令,处理器选择伪操作告知汇编程序应该选择哪一种指令系统
.8086 选择8086指令系统
.286 选择80386指令系统
2.2、段定义伪操作
2.2.1、完整的段定义伪操作
存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换成目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,并且需要把有关信息通过目标模块传给连接程序,以便在连接程序把不同的段和模块连接在一起,形成一个可执行程序
段定义伪操作:
segname SEGMENT [align_type][combine_type][use_type][‘class’]
…
segname ENDS
(1)定位类型(align_type):说明段的起始地址应有怎样的边界值,它们可以是:PARA,BYTE,WORD,DWORD,PAGE
(2)组合类型(combine_type):说明程序连接时,不同模块中同名分段的合并方法,它们可以是:PRIVATE,PUBLIC,COMMON,AT expression,MEMORY,STACK
(3)使用类型(use_type):用来说明使用16位寻址方式还是32位寻址方式。它们可以是USE16,USE32
(4)类别说明(’class’):类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起
ASSUME伪操作用于明确段和段寄存器的关系,格式如下:
ASSUME assignment,…,assignment
其中assignment说明分配情况,其格式如下:
segment register name:segment name
其中,段名必须是CS,DS,ES和SS中的一个,段名必须是由SEGMENT定义的段中的段名。
ASSUME伪操作只是指定某个段分配给哪一个段寄存器,并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。代码段的段地址装入CS寄存器是在程序初始化时完成的
2.2.2、存储模型与简化段定义伪操作
(1)MODEL伪操作
MODEL伪操作格式如下:
. MODEL memory_model [,model options]
memory_model用来表示存储模型,即用来说明在存储器中是如何安放各个段的。也就是说,它说明代码段在程序中如何安排,代码的寻址是近还是远;数据段在程序中又是如何安排的,数据的寻址是近还是远,可以建立如下七种存储模型:Tiny,Small,Medium,Compact,Large,Huge,Flat
model options允许用户指定三种选项:高级语言接口、操作系统和堆栈距离
(2)简化的段定义伪操作
汇编程序给出的标准段有下列几种:
code 代码段
initialized data 初始化数据段
uninitialized data 未初始化数据段
far initialized data 远初始化数据段
far uninitialized data 远未初始化数据段
contants 常数段
stack 堆栈段
对应以上的标准段,可有如下的简化段伪操作:
.CODE[name]
.DATA
.DATA?
.FARDATA[name]
.FARDATA?[name]
.CONST
STACK[size]
2.2.3、段组定义伪操作
GROUP伪操作允许用户自行指定段组把多个数据段组成一个段组DGROUP,程序在访问各数据段时使用一个数据段寄存器。格式如下:
grpname GROUP segname[,segname]
2.3、程序开始和结束伪操作
NAME module_name
TITLE text
END [label] 表示源程序结束
标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序使用标号,其他子程序模块只用END而不必指定标号
.STARTUP 用来定义程序的初始入口点,并产生设置DS,SS和SP的代码
.EXIT [return_value] 用来产生退出程序并返回操作系统的代码
2.4、数据定义及存储器分配伪操作
[variable] Mnemonic Operand,…, Operand [;Comment]
变量字段:记以第一个字节的偏移地址
助记符字段:说明所定义的数据类型。常用类型有以下几种:DB,DW,DD,DF,DQ,DT。这些伪操作可以把其后跟着的数据存入指定的存储单元,形成初始化数据;或者只分配存储空间而不存入确定的数值,形成为初始化数据。汇编程序可以在汇编期间在存储器中存入数据
注释字段:说明该伪操作的功能
复制操作符DUP,格式如下:
repeat_count DUP(Operand,…, Operand)
在数据定义伪操作前面的变量的值,是该伪操作中的第一个数据项在当前段内的第一个字节的偏移地址。变量的类型属性,用来表示该语句中的每一个数据项的长度,变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令
PTR属性操作符可以指定操作数的类型属性,它优先于隐含的类型属性,格式如下:
type PTR Variable+-constant expression
其中,类型属性可以是BYTE,WORD,DWORD,FWORD,QWORD或TBYTE
LABEL伪操作符也可以给变量赋以不同的类型属性,格式如下:
name LABEL type
2.5、表达式赋值伪操作
有时程序中多次出现同一个表达式,为方便起见,可以用赋值伪操作给表达式赋予一个名字,其格式如下:
Expression_name EQU Expression
Expression_name = Expression
2.6、地址计数器与对准伪操作
(1)地址计数器$
$表示装入模块的地址指针。当$用在指令中时,它表示本指令的第一个字节的地址。当$用在伪操作的参数字段时,表示的是地址计数器的当前值
(2)ORG伪操作
ORG伪操作用来设置当前地址计数器的值,其格式为:
ORG constant expression
(2)EVEN伪操作
EVEN伪操作使下一个变量或指令开始于偶数字节地址,其格式为:
EVEN
(3)ALIGN伪操作
ALIGN伪操作为保证双字数组边界从4的倍数开始创造了条件,其格式为:
ALIGN boundary
2.7、基数控制伪操作
.RADIX伪操作可以把默认的基数改变为2~16范围内的任何基数,其格式如下:
.RADIX expression
3、汇编语言程序格式
汇编语言程序中的每个语句可由4项组成,格式如下:
[name] operation operand [;comment]
名字项:标号
操作项:助记符,它可以是指令、伪操作或宏指令
操作数项:由一个或多个表达式构成,提供未执行所要求的操作而需要的信息
注释项:用来说明程序或语句的功能
3.1、名字项
一般来说,名字项可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现
(1)标号,标号在代码段中定义,后面跟着冒号:,它也可以用LABEL或EQU伪操作来定义。此外,它还可以作为过程名定义。标号经常在转移指令或CALL指令的操作数字段中出现,用以表示转向地址
标号有3种属性:段、偏移和类型
段属性定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中
偏移属性,标号的偏移地址是从段起始地址到定义标号的位置之间的字节数
类型属性,用来指出该标号是在本段内引用还是在其他段中引用。如是在段内引用的,则称为NEAR,如在段外阴用,则称为FAR
(2)变量,变量在数据段或附加段中定义,后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经常在操作数字段中出现,它也有段、偏移和类型三种属性
段属性:定义变量的段起始地址,此值必须在一个段寄存器中
偏移属性:变量的偏移地址是从段的起始地址到定义变量的位置之间的字节数
类型属性:变量的类型属性定义该变量所保留的字节数
3.2、操作项
操作项可以是指令、伪操作或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪操作,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开
3.3、操作数项
操作数项是由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个或两个,或三个,或一个没有。对于伪操作和宏指令,则给出它们所要求的参数
操作数项可以是常数、寄存器、标号、变量或有表达式组成。表达式是常数、寄存器、标号、变量与一些操作符相结合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址,形成指令
(1)算术操作符:+,-,*,/,MOD
(2)逻辑与移位操作符:AND,OR,XOR,NOT,SHL,SHR
(3)关系操作符:EQ,NE,LT,GT,LE,GE
(4)数值回送操作符:TYPE,LENGTH,SIZE,OFFSET,SEG
(5)属性操作符:PTR,段操作符,SHORT,THIS,HIGH和LOW、HIGHWORD和LOWWORD
3.4、注释项
注释项用来说明一段程序、一条或几条指令的功能