> For the complete documentation index, see [llms.txt](https://lewiszlw.gitbook.io/notebooks/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lewiszlw.gitbook.io/notebooks/blogs/history/hui-bian-yu-yan-cheng-xu-ge-shi.md).

# 汇编语言程序格式

## 概述

汇编语言是一种面向机器的程序设计语言，它采用助记符来表示操作码和操作数，用符号地址表示操作数地址，因而易记、易读、易修改，给编程带来很大方便。

用汇编语言编写的程序能够直接利用硬件系统的特性，直接对位、字节、字寄存器、存储单元、I/O端口等进行处理，同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序，这种程序不但占用内存空间少，而且执行速度快 。

用汇编语言编写的源程序在输入计算机后，需要将其翻译 成目标程序，计算机才能执行相应指令，这个翻译过程称为汇编，完成汇编任务的程序称为汇编程序。

汇编程序以汇编语言源程序文件作为输入，完成汇编后产生两种输出文件：目标程序文件和源程序列表文件。

* 目标程序文件由二进制代码指令组成，经连接定位后可由计算机执行；
* 源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。

汇编语言源程序必须符合汇编程序的语法要求

* 源程序分段，若干个段组成一个汇编语言源程序。
* 源程序以END结束，一个源程序只能有、并且只能有一个END。
* 一个段由若干个语句行组成。 以 “段名 SEGMENT / 段名 ENDS” 指示段的开始和结束。
* 代码段的第一个语句一般是 “ASSUME”， ASSUME在段寄存器与段名之间建立了对应关系，例如段名为 “DATA” 的段是数据段。
* 程序中主要有两类语句：指令语句（助记符指令），指示性语句（伪指令）。
* 两种程序结构

## 语句类型和语句格式

### 语句类型

* 指令语句：这类指令能够产生目标代码，是CPU可以执行的能够完成特定功能的语句，主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码，对应着特定的操作。
* 伪指令语句：伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句，它不产生目标代码，仅仅在汇编过程中告诉汇编程序应如何汇编，并完成相应的伪操作。
* 宏指令语句：宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令，可包括多条指令或伪指令 。

### 语句格式

汇编语言语句可以由以下几部分组成：\[标识符] 操作符 \[操作数] \[；注释]

* 标识符是一个符号，表示本条语句的符号地址。一般来说，标识符可以是标号和变量。标号和变量都具备3种属性：段属性、偏移属性及类型属性。
* 操作符可以是机器指令、伪指令和宏指令的助记符。
* 操作数字段是操作符的操作对象。当有两个或两个以上的操作数时，各操作数之间用逗号隔开。
* 注释字段是以“；”开头的说明部分。注释字段是语句的非执行部分。

### 操作数和表达式

汇编语言语句中操作数可以是常数、寄存器号、变量、标号与(伪)运算符组合起来的表达式。在表达式中，运算符充当着重要的角色。这些运算符都是面向汇编程序的，都由汇编程序在汇编过程中解释并“执行”，而不是像指令那样由CPU去执行。

8086宏汇编有算术运算符、逻辑运算符、关系运算符、分析运算符和综合运算符共5种。

1. 算术运算符

* 常见的有+、-、MOD、SHL、SHR、\*、/共7个符号，分别表示加、减、取模(求余数)、逻辑左移、逻辑右移、乘、除。这些操作符都可用于数据之间的运算，+、-操作符还可用于地址之间、数据与地址之间的运算。

1. 逻辑运算符

* 有NOT、AND、OR、XOR共4个符号，分别表示非、与、或、异或，可用于对两个(或一个)数据进行操作。

1. 关系运算符

* 关系运算符对两个数据进行比较，有EQ、NE、LT、GT、LE、GE共6个符号，分别表示等于、不等于、小于、大于、小于或等于、大于或等于，操作的结果为逻辑值。
* 若条件满足，则结果为“真”，若条件不满足，则结果为“假”。“真”用-1(n位全1)表示，“假”用0(n位全0)表示。

1. 取属性(分析)运算符

* 取属性运算符可以取出运算对象的某个属性。常见的有SEG、OFFSET、TYPE、LENGTH、SIZE共5个符号，分别表示取段地址、取偏移地址、取类型、取长度、取大小，操作的结果都是数值常数。
* 格式： SEG 变量名或标号 返回变量或标号所在段的段基值。 例如，若A为变量名或标号，则 SEG A 返回A所在段的地址。
* 格式： OFFSET 变量名或标号 返回变量或标号的偏移地址部分。 例如，若A为变量名或标号；则OFFSET A 返回A的偏移地址。

1. 指定属性(合成)运算符

* 指定属性运算符可用于指定存储器操作数或标号的属性。
* 常见的有PTR、：、THIS等3个符号，其功能分别为： 指定存储器操作数或标号的类型、指定存储器操作数的段归属、指定当地的变量或标号的类型。
* 格式： 类型名 PTR 存储器操作数或标号

表达式中常用的伪操作符按以下顺序依次优先处理： （从左到右）

* (i)　()、 ［］、〈〉(ii)　LENGTH、WIDTH、SIZE、MASK (iii)　·(结构字段名操作符) (iv)　: (段超越前缀的操作符) (v)　PTR、OFFSET、SEG、TYPE、THIS (vi)　HIGH、LOW
* (i)　+ (正号)、- (负号) (ii)　\*、/ (iii)　MOD、SHL、SHR (iv)　+、 -
* EQ、NE、LT、LE、GT、GE
* (i) NOT (ii) AND (iii) OR、XOR
* SHORT

## 伪指令

1. 数据定义伪指令

* 一般格式：\[变量名] 操作符 参数 \[，参数… ]\[；注释]
* 常用的数据定义伪指令操作符
  * 定义字节变量伪指令 DB
  * 定义字变量伪指令 DW
  * 定义双字变量伪指令 DD
  * 定义四字变量伪指令 DQ
  * 定义十字节变量伪指令 DT
* 常见的参数有以下5种形式：
  * 常数或常数表达式
  * ？
  * DUP 子句
  * 地址表达式（DB除外）
  * 字符串

1. 地址计数器伪操作
2. 段定义伪操作
3. 过程定义伪操作

## DOS系统功能调用及BIOS调用

* MS-DOS 为用户提供了两组系统服务程序，用户可以按规定的方式调用这些系统服务程序。
* DOS系统功能调用不要求用户对硬件有太多的了解，使用DOS系统功能调用的程序可移植性好，编程简单。
* BIOS驻留在ROM中，包括系统自检程序、初始化引导程序及外部设备的处理程序。BIOS调用要求用户对硬件有相当的了解，使用BIOS调用的程序可移植性较差。 ![汇编语言程序格式1](http://ofolh8dcq.bkt.clouddn.com/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E6%A0%BC%E5%BC%8F1.PNG)

DOS系统功能调用 指类型为21H的软件中断，其对应的中断处理程序中包含了一系列最常用的功能子程序，这些子程序分别实现外设管理、文件读/写和管理、目录管理等功能。 ![汇编语言程序格式2](http://ofolh8dcq.bkt.clouddn.com/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E6%A0%BC%E5%BC%8F2.PNG)

***

> 《IBM-PC汇编语言程序设计（第2版）》沈美明 温冬婵 著
