第四章 汇编语言程序设计
本章的汇编语言程序设计的主要内容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。在介绍之前,我们还是来学习汇编语言的一些基础知识)
4.1 汇编语言程序设计概述
1、计算机的汇编语言
以助记符表示的指令,每一条指令就是汇编语言的一条语句。 (汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。汇编语言的语句有严格的格式要求)
2、汇编语言的语句格式
MCS-51汇编语言的语句格式表示如下:
[<标号>]: <操作码> [<操作数>]; [<注释>]
标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。)
操作码:规定语句执行的操作内容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。 注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符) 分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后
空格( )用于操作码和操作数之间
逗号(,)用于操作数之间,分割两个以上的操作数 分号(;)用于注释之前。
(注释部分汇编语言不对它们进行编译的。而是将标号,操作码,操作数部分加以翻译成机器码。看一个例子)
(表面是延时子程序的第一条语句,故加上标号,便于访问。上面的语句如何编译的呢?)
ORG 3000H 3000H E8H DELY: MOV A, R0 ; 这是延时子程序
(在这条指令前,加一个伪指令,定义程序首地址,我们把这一段语句定义为从3000H
开始,经过编译以后,那么这一条语句的标号部分,DELY这时候就转化为实际的地址值3000H,指令操作码和操作数部分编译后为E8H,这就是汇编语言与机器代码之间的关系。这个转化工作是由编译程序来完成的。)
4.2 单片机汇编语言程序的结构形式
(一般有三种形式)
顺序结构;分支结构;循环结构 (下面我们来依次介绍一下这些结构) 1、顺序结构程序设计 顺序程序是最简单的程序结构,在顺序程序中既无分支、循环,也不调用子程序,程序执行时一条一条地按顺序执行指令。
(下面来看一个例子,该部分程序完成一个3字节无符号数的加法)
例4.1:三字节无符号数相加,被加数在内部RAM的50H、51H和52H单元中,加数在内部RAM的53H、54H和55H单元中,其中被加数单元和加数单元的高位地址存放的为最低位字节;要求把相加之和存放在50H、51H和52H单元中。进位位存放在位寻址区的00H位中。
(我们来看编制的程序)
ADDU: MOV R0, #52H ;被加数的低字节地址 MOV R1, #55H ; 加数的低字节地址 MOV A, @R0 ;取被加数的最低位数据 ADD A, @R1 ;与加数的最低字节相加(第一次相加,不考虑进位位)
MOV @R0, A ;存低字节相加结果 DEC R0 ;地址减1 DEC R1 ; MOV A, @R0 ADDC A, @R1 ;中间字节带进位相加 MOV @R0, A ;存中间字节相加结果 DEC R0 ;地址减1 DEC R1 MOV A, @R0 ADDC A, @R1 ;高位字节带进位相加 MOV @R0, A ;存高字节相加结果 CLR A ;进位送00H位保存。(对A清零) ADDC A, #00H ;(把进位位移到A的最低位) MOV 20H, A ;进位位送入位地址00H(相当于把A的最低位放到20H的最低位)
RET
2、分支结构程序设计
程序分支是通过转移指令实现的,为清除起见,把分支程序分为以下几种情况。
单分支程序
单分支使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺序执行。
多分支程序
⑴使用多条CJNE指令,通过连续比较,实现多分支程序转移。 ⑵使用查地址表方法实现多分支程序转移。
⑶使用查转移指令表的方法实现多分支程序转移。 ⑷通过堆栈操作实现多分支程序转移。
(我们就下面的例子来看看利用多条CJNE,如何实现多分支程序转移的。) 例4.2:有一温度控制系统,现场采集的温度值(Ta)放在累加器A中。此外,在内部RAM 54H单元存放控制温度下限值(T54),在55H单元存放控制温度上限值(T55)。若Ta> T55,则程序转向JW(降温处理程序);若Ta< T54,则程序转向SW(升温处理程序);若T55≥Ta≥T54,则程序转向FH(返回主程序)。
(下面是简单的程序段) 有关程序段如下: CJNE A, 55H, LOOP1 ; AJMP FH LOOP1: JNC JW CJNE A, 54H, LOOP2 AJMP FH LOOP2: JC SW FH: RET JW: : : SW: : :
(CJNE 对两数做相减,但不把减的结果写回去,仅用来改变标志位C)
3、循环程序 循环是为了重复执行一个程序段,MCS-51汇编语言中虽然没有专用的循环指令,但可以使用条件转移指令通过条件判断来控制循环是否结束。
4.3 MCS-51汇编语言的伪指令
伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 (一般在51单片机中用到的伪指令有以下几个) ORG 汇编起始地址命令 命令格式: [<标号:>] ORG <地址>
其中[<标号:>]是选择项,根据需要选用。 <地址>项,通常为16位绝对地址,但也可以使用标号或表达式表示。
(这个伪指令一般出现在程序的起始位置,用来规定目标程序的起始地址,例如:) 例如:
ORG 8000H
8000H 74H START: MOV A, #00H 8001H 00H
END 汇编终止命令 命令格式: [<标号:>] END [<表达式>] END是汇编语言源程序的结束标志。
(因此,汇编语言源程序只能有一条该伪指令,编译系统在编译过程中,遇到该伪指令就会停止编译,即只对END之前的程序编译,后面的程序不再编译。)
EQU (EQUate) 赋值命令
命令格式:
<字符名称> EQU <赋值项> 例:
DATA1 EQU 40H (用DATA1来表示40H单元,以后程序中出现DATA1就代表40H单元,但如何区分它是代表数据还是地址呢?这主要看程序中的指令形式,如果是数据,则应加“#”即 #DATA1,
否则为地址。)
执行: MOV A, DATA1 ;DATA1为片内的40H单元 执行: MOV A, #DATA1 ;DATA1为数据40H
DB 定义字节命令 命令格式:
[<标号:>] DB <8位数表>
(主要用于在程序区定义一些常数表格) 例如: 存放七段数码管(共阳极)显示的十六进制数的字型码,可使用多条DB命令定义: ORG 8100H
LED_TAB: DB C0H, F9H, A4H, B0H DB 99H, 92H, 82H, F8H DB 80H, 90H, 88H, 83H DB C6H, A1H, 86H, 84H
(这些数据依次存放在8100H为起始地址的程序存储区中,它们是共阳极七段数码管的字型数据,把它们组成常数表格放在程序存储区)
DW 定义数据字命令 命令格式:
[<标号:>] DW <16位数表>
(在本讲中我们介绍了汇编语言的格式,几种基本的程序结构格式,伪指令等,希望大家在课后的练习加以熟悉掌握。)
(从这一讲开始,我们来讲授单片机汇编语言程序设计,它有两部分构成:一部分是与硬件电路密切相关的程序,我们将在介绍硬件的过程中加以介绍,另一个部分就是类似于数值运算,数值转换等这样一类程序。这一章中,我们主要向大家介绍后一类的程序。)
4.4 MCS-51单片机汇编语言程序设计举例
(一个单片机的应用系统程序,根据系统应用的范围、复杂程度的不同,程序的复杂程度也是不同的,但作为单片机的应用系统程序应该包括) 1、主程序: 顺序执行的无限循环的程序,运行过程处于全封闭状态。 例如: 带显示及键盘输入的某单片机系统的主程序框图结构为:
(上电、复位后对相关的寄存器进行初始化,调用显示子程序,显示初始状态,调用键盘扫描子程序的功能就是在那里等待你的键盘输入,当有键按下,就调用相应的键的识别子程序,来识别到底是哪个键被按下,不同键有不同的处理程序,当键值识别子程序完成后回到显示子程序,构成一个封闭的环,连续不断地运行下去。下面我们再来看什么是子程序)
2、子程序: 完成某种特定功能的一个程序段,也称为一个程序模块。
(子程序是供其它程序反复使用的,完成某种特定功能的程序段,采用子程序结构,可以简化程序的逻辑结构,缩短程序的长度。)
(提供给其它程序使用的子程序要与其它程序进行信息交换,必须要告知其它程序,我这个子程序调用的条件是什么,即有什么样的入口参数,同时也要告知处理的结果放在哪儿,即子程序也要有出口参数,完成子程序与其它程序之间完成数据传递,因此) 作为子程序,要有以下约定: 子程序功能: 程序入口: 程序出口: 程序影响:
(程序影响指影响哪些寄存器,在这里仍以前面介绍过的三字节无符号数的加法为例)
子程序功能: 完成三字节无符号数的加法。 程序入口: 50H、51H、52H为被加数,数据结构是50H为最高位 55H、54H、53H为加数,数据结构是53H为最高位 程序出口: 50H、51H、52H为和值。数据结构是50H为最高位,位地址00H为进位位。 程序影响: R0、 R1、 R7、 A
(下面是这一段程序)
ADDU: MOV R0, #52H ;被加数的低字节地址 MOV R1, #55H ; 加数的低字节地址 MOV R7, #3 ;三字节加法,循环次数为三次
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第四章 汇编语言程序设计(DOC)在线全文阅读。
相关推荐: