📜  嵌入式系统-汇编语言

📅  最后修改于: 2021-01-07 05:46:22             🧑  作者: Mango


开发了汇编语言来为机器级代码指令提供助记符或符号。汇编语言程序由助记符组成,因此应将其翻译为机器代码。负责此转换的程序称为汇编程序。汇编语言通常被称为低级语言,因为它直接与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”文件是可选的。这对程序非常有用,因为它列出了所有操作码和地址以及汇编程序检测到的错误。

  • 汇编程序需要第三步,称为linking 。链接程序将获取一个或多个目标文件,并生成扩展名为“ 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数据定义。下面是一些数据库示例-

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指令用于指示地址的开头。它采用十六进制或十进制格式的数字。如果在数字之后提供H,则数字将被视为十六进制,否则视为十进制。汇编程序将十进制数转换为十六进制。

  • EQU(等于) -用于定义常量而不占用存储位置。 EQU将常数值与数据标签相关联,以便该标签出现在程序中,其常数值将代替该标签。在执行指令“ MOV R3,#COUNT”时,寄存器R3将被加载值25(注意#号)。使用EQU的优点是程序员可以更改一次,而汇编程序将更改所有出现的情况。程序员不必搜索整个程序。

  • END指令-指示源(asm)文件的结尾。 END指令是程序的最后一行;汇编器将忽略END指令之后的所有内容。

汇编语言中的标签

汇编语言中的所有标签必须遵循以下给出的规则-

  • 每个标签名称必须唯一。汇编语言编程中用于标签的名称包括大写和小写字母,数字0到9,以及特殊字符(例如问号(?),句点(。),@,下划线(_),和dollar($)。

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

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