第四章-汇编语言程序的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 <赋值项>

例:

相关文档
最新文档