文章目录
【 1. 前言 】
- 无论哪种嵌入式系统,都有两种编程语言—汇编语言和高级语言(主要是C语言)
- 汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。
- 高级语言编程快捷,但程序长,占用存储空间大,执行的实时较差;
- 为发挥各自的优势,在复杂的嵌入式系统中,往往实时控制部分采用汇编语言,而数据的运算和处理部分采用C语言。因此对于嵌入式系统的工程师而言,两种语言都必须掌握。
- 无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言) 计算机才能执行。
- 支持写入8XX51单片机或仿真调试的目标程序有两种文件格式:
.BIN文件和:HEX文件,
.BIN文件是由编译器生成的二进制文件,是程序的机器码。
.HEX文件是由INTER公司定义的一种格式,这种格式包括地址、数据和校验码,并用ASCII码来存储。
.BIN文件需通过符号转换程序OHS51进行转换,成为HEX文件后,才能显示并可供打印出来。
- 汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。
- 汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。
- 汇编语言源程序:用户用汇编语言助记符编的应用程序。
- 目标程序:计算机能识别的机器码程序
- 1. 手工汇编:人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。
- 2. 机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。
目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,并且还有仿真调试功能,如Wave、Keil 、Proteus等。 - 程序设计的步骤:
【 2. 伪指令 】
伪指令: 为汇编程序(翻译官)提供信息的指令,它没有机器码,不被计算机执行。
- 1. 起始指令ORG nn
功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。
- 例如:
- 2. 字节定义 DB (字节常数,或字符,或表达式)
功能:在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。
- 例如:
- 3. 字定义 DW (字节常数,或表达式)
功能:在程序存储器中以标号为起始地址的单元里存放的数为字数据(即16位的二进制数)
- 例如: GH :DW 1234H,5678H, 08
- 4. 保留字节 DS (数值表达式)
功能:在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。
例如:L1:DS32; 从L1地址开始保留32个存储单元。 - 5. 等值指令 EQU (数值表达式)
功能:表示EQU两边的量等值,用于为标号或标识符赋值。
- 例如:
- 6. 位定义 BIT (数值表达式)
作用:同EQU指令,不过定义的是位操作地址。
例如:AIC BIT P1.1。 - 7. 汇编结束 END
作用:指示源程序段结束。
END指令放在程序的最后。
【 3. 顺序程序设计 】
【 4. 分支程序设计 】
由条件转移指令构成程序判断框部分,形成分支结构,通常转移条件取决标志位。常见的分支见下图:
多分支散转程序的设计
- 有一类分支程序,它根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。
- 这类程序通常利用JMP@A+DPTR间接转移指令实现转移。
- 分类:
- 查转移地址表:。将转移地址列成表格,将表格的内容作转移的目标地址。
- 查转移指令表:将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行,
【 5. 循环程序设计 】
- 当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。
- 循环次数的控制:
- 先判断再处理,即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。
- 先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。
- 循环可以有单重循环和多重循环,在多重循环中,内、外循环不能交叉,也不允许外循环跳入内循环。
【 6. 位操作程序设计 】
- MCS.-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算.这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要多花运算时间。
【 7. 子程序设计 】
- 当一段程序需多次应用,或为多人应用时,这段程序编为子程序.
- 子程序通过 ACALL 和 LCALL 两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。
- 子程序 节省占用的存储单元,使程序简短、清晰。
- 子程序必须以 RET 指令结尾。
- 保护现场。
如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。 - 设置入口参数和出口参数
用之前主程序要按子程序的要求设置好地址单元或存储器(称为 入口参数 )以便子程序从指定的地址单元或存储器获得输入数据;
子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为 出口参数 ),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。 - 子程序中可包括对另外子程序的调用,称为子程序嵌套。
【 8. 小结 】
- 程序设计的关键在于指令熟悉和算法(思路)正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。
- 伪指令是非执行指令,提供汇编程序以汇编信息。