嵌入式系统 - 汇编语言
汇编语言的开发是为了为机器级代码指令提供**助记符**或符号。汇编语言程序由助记符组成,因此它们应该被翻译成机器代码。负责这种转换的程序被称为**汇编器**。汇编语言通常被称为低级语言,因为它直接与 CPU 的内部结构交互。要使用汇编语言编程,程序员必须了解 CPU 的所有寄存器。
C、C++、Java 等不同的编程语言以及其他各种语言被称为高级语言,因为它们不涉及 CPU 的内部细节。相反,汇编器用于将汇编语言程序翻译成机器代码(有时也称为**目标代码**或**操作码**)。类似地,编译器将高级语言翻译成机器代码。例如,要使用 C 语言编写程序,必须使用 C 编译器将程序翻译成机器语言。
汇编语言的结构
汇编语言程序是一系列语句,这些语句要么是汇编语言指令(例如 ADD 和 MOV),要么是称为**指令**的语句。
**指令**告诉 CPU 要做什么,而**指令**(也称为**伪指令**)则向汇编器发出指令。例如,ADD 和 MOV 指令是 CPU 运行的命令,而 ORG 和 END 是汇编器指令。当使用 ORG 指令时,汇编器将操作码放置到内存位置 0,而 END 指示源代码的结尾。程序语言指令由以下四个字段组成:
[ label: ] mnemonics [ operands ] [;comment ]
方括号([ ])表示该字段是可选的。
**标号字段**允许程序通过名称引用代码行。标号字段不能超过一定数量的字符。
**助记符**和**操作数字段**一起执行程序的实际工作并完成任务。语句如 ADD A , C & MOV C, #68 其中 ADD 和 MOV 是助记符,它们生成操作码;“A, C”和“C, #68”是操作数。这两个字段可能包含指令。指令不会生成机器代码,仅供汇编器使用,而指令则被翻译成机器代码供 CPU 执行。
1.0000 ORG 0H ;start (origin) at location 0 2 0000 7D25 MOV R5,#25H ;load 25H into R5 3.0002 7F34 MOV R7,#34H ;load 34H into R7 4.0004 7400 MOV A,#0 ;load 0 into A 5.0006 2D ADD A,R5 ;add contents of R5 to A 6.0007 2F ADD A,R7 ;add contents of R7 to A 7.0008 2412 ADD A,#12H ;add to A value 12 H 8.000A 80FE HERE: SJMP HERE ;stay in this loop 9.000C END ;end of asm source file
**注释字段**以分号开头,分号是注释指示符。
请注意程序中的标号“HERE”。任何引用指令的标号都应后跟冒号。
汇编和运行 8051 程序
这里我们将讨论汇编语言的基本形式。创建、汇编和运行汇编语言程序的步骤如下:
首先,我们使用编辑器键入类似于上述程序的程序。所有 Microsoft 操作系统附带的像 MS-DOS EDIT 程序这样的编辑器可用于创建或编辑程序。编辑器必须能够生成 ASCII 文件。源文件的“asm”扩展名在下一步由汇编器使用。
“asm”源文件包含在步骤 1 中创建的程序代码。它被馈送到 8051 汇编器。然后,汇编器将汇编语言指令转换为机器代码指令,并生成一个**.obj 文件**(目标文件)和一个**.lst 文件**(列表文件)。它也称为**源文件**,因此某些汇编器要求此文件具有“src”扩展名。“lst”文件是可选的。它对程序非常有用,因为它列出了所有操作码和地址以及汇编器检测到的错误。
汇编器需要第三步,称为**链接**。链接程序获取一个或多个目标文件,并生成一个扩展名为“abs”的绝对目标文件。
接下来,“abs”文件被馈送到一个名为“OH”(目标到十六进制转换器)的程序,该程序创建一个扩展名为“hex”的文件,该文件已准备好刻录到 ROM 中。
数据类型
8051 微控制器包含一个 8 位的单一数据类型,每个寄存器也是 8 位大小。程序员必须将大于 8 位(00 到 FFH,或十进制 255)的数据分解,以便它可以由 CPU 处理。
DB(定义字节)
DB 指令是汇编器中使用最广泛的数据指令。它用于定义 8 位数据。它还可以用于定义十进制、二进制、十六进制或 ASCII 格式的数据。对于十进制,十进制数后的“D”是可选的,但对于“B”(二进制)和“Hl”(十六进制)是必需的。
要指示 ASCII,只需将字符放在引号中('像这样')。汇编器会自动为数字/字符生成 ASCII 代码。DB 指令是唯一可用于定义大于两个字符的 ASCII 字符串的指令;因此,它应该用于所有 ASCII 数据定义。下面给出了一些 DB 的示例:
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
ASCII 字符串周围可以使用单引号或双引号。DB 也用于以字节大小的块分配内存。
汇编器指令
8051 的一些指令如下:
**ORG(原点)** - 原点指令用于指示地址的开始。它采用十六进制或十进制格式的数字。如果数字后提供 H,则该数字将被视为十六进制,否则为十进制。汇编器将十进制数转换为十六进制。
**EQU(等价)** - 它用于定义常量而不占用内存位置。EQU 将一个常数值与数据标号关联,以便标号出现在程序中,其常数值将替换为标号。在执行指令“MOV R3, #COUNT”时,寄存器 R3 将加载值为 25(注意 # 符号)。使用 EQU 的优点是程序员可以更改它一次,汇编器将更改其所有出现;程序员不必搜索整个程序。
**END 指令** - 它指示源(asm)文件的结尾。END 指令是程序的最后一行;END 指令后的任何内容都会被汇编器忽略。
汇编语言中的标号
汇编语言中的所有标号都必须遵循以下规则:
每个标号名称必须唯一。汇编语言编程中用于标号的名称由大写和小写字母、数字 0 到 9 以及特殊字符组成,例如问号(?)、句点(.)、@ 符号、下划线(_)和美元符号($)。
第一个字符应为字母字符;它不能是数字。
保留字不能用作程序中的标号。例如,ADD 和 MOV 字是保留字,因为它们是指令助记符。