汇编语言源程序
1. 汇编语言源程序结构
一个完整的汇编语言源程序通常由若干个逻辑段(Segment)组成, 包括数据段、附加段、堆栈段和代码段,它们分别映射到存储器中的物理段上。每个逻辑段以 SEGMENT语句开始, 以 ENDS语句结束,整个源程序用END语句结尾。
代码段中存放源程序的所有指令码, 数据、变量等则放在数据段和附加段中。程序中可以定义堆栈段,也可以直接利用系统中的堆栈段。具体一个源程序中要定义多少个段应根据实际需要来定。但一般来说,一个源程序中可以有多个代码段, 也可以有多个数据段、附加段及堆栈段, 但一个源程序模块只可以有一个代码段、一个数据段、个附加段和一个堆栈段。将源程序以分段形式组织是为了在程序汇编后,能将指令码和数据分别装入存储器的相应物理段中
2. 源程序结构框架
段名1 SEGMENT
...
段名1 ENDS
段名2 SEGMENT
...
段名2 ENDS
...
段名n SEGMENT
...
段名n ENDS
3. 语句类型和格式
(1). 指令性语句的一般格式
[标号] : [前缀] 操作码 [操作数1, 操作数2] [;注释]
“[ ]” 括起来的内容可以省略, 操作数可以有2个、1个和没有。
(2). 指示性语句的一般格式
[名字] [伪操作] 操作数1, 操作数2, ... [;注释]
“[ ]” 括起来的内容可以省略。
4. 数据项
(1). 常量
常量类型 | 表示 | 举例 |
---|---|---|
十进制常量 | 以字母 “D” 结尾或不加结尾 | 52D, 52 |
二进制常量 | 以字母 “B” 结尾 | 1011B |
十六进制常量 | 以字母 “H” 结尾 | 5CH |
字符常量 | 用单引号括起的一个或多个ASCII字符码 | ’DD’ |
(2). 标号 LABLE
指令的标号由程序员确定, 不能与指令助记符或伪指令名, 也不能由数字打头, 字符个数不能超过31个。
标号有3种属性: 段值、偏移量和类型。
(3). 变量
变量是存储器中的某个数据区的名字, 变量的类型有:
类型 | 长度 | 表示 |
---|---|---|
字节 | 8位 | BYTE |
字 | 16位 | WORD |
双字 | 32位 | DWORD |
四字 | 64位 | QWORD |
十节字 | 80位 | TBYTE |
(4). 表达式
表达式不是指令, 本身不能执行, 在程序执行时, 表达式本身是一个有确定值的操作数。
运算符 | 符号 |
---|---|
加 | + |
减 | - |
乘 | ***** |
除 | / |
取余 | MOD |
与 | AND |
或 | OR |
非 | NOT |
异或 | XOR |
等于 | EQ |
不等于 | NE |
小于 | LT |
大于 | GT |
小于等于 | LE |
大于等于 | GE |
(5). 运算符
名字 | 运算符 | 作用 | 例子 |
---|---|---|---|
取偏移地址运算符 | OFFSET | 取标号或变量的偏移地址 | MOV SI, OFFSET DATA1 |
取段地址运算符 | SEG | 取标号或变量的段地址 | MOV AX, SEG DATA1 |
属性运算符 | PTR | 指定其后面存储器操作数的类型 | MOV AL, BYTE PTR [SI] |
方括号运算符 | [ ] | 表示存储器操作数, 括号中的内容表示操作数的偏移地址 | |
段重设运算符 | : | 用来指定一个存储器操作数的段属性而不管原来隐含的段 | MOV AX, ES:[SI] |