嵌入式系统 - 汇编语言

汇编语言的开发是为了为机器级代码指令提供助记符或符号。汇编语言程序由助记符组成,因此应将其转换为机器代码。负责此转换的程序称为汇编程序。汇编语言通常被称为低级语言,因为它直接与 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(origin) − origin 指令用于指示地址的开始。它采用十六进制或十进制格式的数字。如果数字后提供 H,则该数字被视为十六进制,否则为十进制。汇编器将十进制数转换为十六进制。

  • EQU(equate) − 它用于定义一个常量而不占用内存位置。EQU 将常量值与数据标签关联,以便标签出现在程序中,其常量值将替换标签。在执行指令"MOV R3, #COUNT"时,寄存器 R3 将加载值 25(注意 # 符号)。使用 EQU 的优点是程序员可以更改一次,汇编程序将更改其所有出现的位置;程序员不必搜索整个程序。

  • END 指令 − 它表示源 (asm) 文件的结尾。END 指令是程序的最后一行;END 指令之后的任何内容都将被汇编程序忽略。

汇编语言中的标签

汇编语言中的所有标签都必须遵循以下规则 −

  • 每个标签名称都必须唯一。汇编语言编程中标签的名称由大写和小写字母、数字 0 到 9 以及特殊字符(如问号 (?)、句点 (.)、汇率 @、下划线 (_) 和美元 ($))组成。

  • 第一个字符应为字母;不能是数字。

  • 保留字不能用作程序中的标签。例如,ADD 和 MOV 字是保留字,因为它们是指令助记符。