第四章-汇编语言程序的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章汇编语言程序设计
本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。在介绍之前,我们还是来学习汇编语言的一些基础知识)
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 <赋值项>
例: