4.1.1 汇编语言格式
1. 计算机语言——机器语言、汇编语言和高级语言
机器语言
机器语言是计算机能够直接识别和执行的二进制代码,由0和1组成。它是最底层的编程语言,也是计算机硬件能够直接理解的唯一语言。
机器语言的主要特点:
- 直接性:不需要翻译即可被计算机执行
- 机器相关性:不同型号的计算机使用不同的机器语言
- 难理解性:全是二进制数字,人类难以阅读和编写
- 效率高:直接由硬件执行,运行速度最快
示例:一条简单的加法指令在机器语言中可能表示为:
由于机器语言的这些特点,特别是其难以阅读和编写的特性,促使了汇编语言的产生。
汇编语言
用英文符号表示的指令,用汇编语言构成的程序称为汇编语言程序
特点:
- 机器语言和汇编都是面向机器的
- 和单片机的硬件系统直接相关,移植困难
- 程序效率高,占用存储空间小,运行快
- 这是因为助记符和机器语言是一一对应的
- 汇编语言能反映计算机实际运行的情况
- 直接管理和控制硬件设备
对于程序的空间、时间要求很高的场合,汇编语言是不可或缺的

汇编语言程序不能直接被计算机执行,需要经过"汇编"过程转换成机器语言。这个过程由汇编程序(Assembler)完成。
汇编过程主要包括以下步骤:
- 1. 词法分析:将源程序分解成一个个的单词符号
- 2. 语法分析:检查源程序是否符合汇编语言的语法规则
- 3. 地址分配:为程序中的指令和数据分配存储单元
- 4. 代码生成:将汇编指令转换成对应的机器码
- 5. 符号解析:处理程序中使用的符号,建立符号表
示例:汇编语言指令 "MOV AX, BX" 经过汇编后可能生成如下机器码:
汇编程序不仅完成指令的转换,还要处理伪指令、解决地址引用等问题,最终生成可执行的目标程序。
高级语言
参照数学语言而设计,近似于人们日常用语的语言。
特点:
- 编程容易,移植方便
- 占用的内存多
- 要求单片机开发 系统有对应的编译软件
2. 汇编语言格式和种类
汇编语言语句的种类
汇编语言语句可以分为三种主要类型:
1. 指令语句
指令语句是可以被转换成机器码的语句,对应着CPU的操作。
- 格式:[标号:] 操作码 [操作数1] [,操作数2]
- 功能:直接被翻译成机器指令,用于实现程序的具体操作
- 示例:MOV AX, BX(将BX寄存器的内容传送到AX寄存器)
2. 伪指令语句
伪指令语句是给汇编程序的命令,不生成机器码。
- 功能:指导汇编程序如何进行汇编,定义数据、段等
- 特点:只在汇编时起作用,不占用程序的存储空间
- 示例:SEGMENT(定义段)、DB(定义字节数据)
3. 宏指令语句
宏指令是一组指令序列的缩写,可以用一个简单的名字代替一组常用的指令。
- 功能:简化程序编写,提高代码的可重用性
- 特点:在汇编时展开成一组基本指令
- 示例:MACRO(定义宏)、ENDM(宏定义结束)
指令语言格式

- 标号域:语句地址的标致符号
例如:
注意事项:
- 由1-8个ASCII字符组成,第一个字符必须是字母
- 标号后必须有一个冒号
- 不能使用本汇编语言已经定义的符号作为标号
- 同一个标号在程序中只能定义一次,不能重复定义
- 操作码域:指明要完成的操作(指令助记符),例如MOV表示数据传送
是汇编指令中唯一不能空缺的成分
- 操作数域:指令处理的数据或者数据所在的地址,可以没有操作数,也可以有一个或两个操作数
例如:
- 注释域
- 分隔符
- 空格:用于分隔标号、操作码和操作数
- 逗号(,):用于分隔多个操作数
- 分号(;):用于分隔指令和注释
- 冒号(:):用于标号定义,表示某一位置的符号地址
伪指令语句格式

- 伪指令语句和指令语句主要的不同是名字后面没有冒号
4.1.2 伪指令语句
汇编语言程序编程机器语言的过程称为汇编;包括手工汇编和机器汇编两种
伪指令:
机器汇编时,在源程序中向汇编软件发出如何完成汇编的指示信息。
特点:
- 不产生机器指令代码
- 仅仅在汇编时发挥作用。不同汇编软件的伪指令系统有所不同
ORG(origin)
功能:指定程序或数据的起始地址
END(end of assembly)
功能:标识汇编程序的结束。必须是源程序的最后一条语句
- 主程序模块:
- 标号:可选,用于标识
END
语句本身,通常是主程序第一条指令的符号地址。 - 表达式:表示程序模块的入口地址(通常是主程序的起始地址)。只有主程序模块才包含此项,子程序模块没有。
- 也可以不写表达式,但是不推荐
- 子程序模块:
- 标号:可选,用于标识
END
语句。 - 无表达式:子程序模块不需要指定入口地址
以下是
END
伪指令在主程序和子程序中的使用示例,帮助您更好地理解其用法:- 主程序示例:
- 这里
END START
中的START
是主程序的入口地址标号,告诉汇编器程序从START
开始执行。
- 子程序示例:
- 子程序的
END
不需要指定入口地址,因为它不是程序的起点,只是被主程序调用的代码段。
EQU(EQUate)
功能:为符号赋予固定的值,相当于定义常量;
不占用内存空间,只是在汇编过程中进行文本替换操作
DL(define label)
不占用内存空间,只是在汇编过程中进行文本替换操作
功能:定义数据标号,用于数据的间接寻址:<标号>DL<表达式>
数据标号DATA可以通过以下方式使用:
由于DATA是通过DL伪指令定义的数据标号,它在程序中主要用于间接寻址,可以方便地引用指定地址(30H)处的数据。
DB(define byte)
功能:定义字节型数据(8位),会占用真实的内存空间
DW(define word)
功能:定义字型数据(16位),会占用真实的内存空间
DS(define storage)
功能:定义一片连续的存储空间,用于保留内存区域
在汇编器的管理下,
DS
分配的存储空间是独占的,汇编器会确保不同标号或指令分配的内存空间不会重叠。编程者不需要关心具体的内存地址,也不会出现位置被占用的情况(在正确使用的前提下)。这里是一些使用BUFFER的示例代码:
由于BUFFER通过DS伪指令定义了10个字节的存储空间,我们可以用它来临时存储数据,比如作为数据缓冲区使用。
BIT-位定义命令
功能:定义位变量,用于对单个位进行操作
本身不占用额外的真实内存空间,只是为某个位的地址提供一个额外的符号名
总结
- 不占用真实内存空间的指令:
ORG
END
EQU
:只是符号替换,汇编器处理时不分配内存。DL
:只是定义标号,不直接分配内存。BIT
:引用现有内存或寄存器中的位,不额外分配内存。
- 占用真实内存空间的指令:
DB
:定义字节数据,每个字节占用内存。DW
:定义字数据,每个字占用内存(通常 2 字节)。DS
:定义存储空间,按指定字节数分配内存。