《单片机(微控制器)原理及应用》第4章汇编语言程序设计_第1页
《单片机(微控制器)原理及应用》第4章汇编语言程序设计_第2页
《单片机(微控制器)原理及应用》第4章汇编语言程序设计_第3页
《单片机(微控制器)原理及应用》第4章汇编语言程序设计_第4页
《单片机(微控制器)原理及应用》第4章汇编语言程序设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章汇编语言程序设计教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:常用汇编语言程序设计方法。

教学难点:分支程序、散转程序与子程序的设计4.1概述

4.1.1程序设计语言

1.机器语言

2.汇编语言图4-1源程序、汇编程序、目的程序之间关系示意图

3.高级语言4.1.2汇编语言源程序的格式

1.汇编语句格式

[标号:]操作码[操作数][;注释]

这4部份只有操作码段是必须具有的,其余部分为可选项,但对于包含操作数的指令,则操作数段也是必须具有的。例如:

SU:MOVA,#0CDH;CDH

A4.1.3汇编语言伪指令

(1)ORG汇编起始指令

规定目标程序的起始地址,格式如下:

标号操作码操作数

ORG表达式(exp)(2)EQU赋值指令把操作数段中的地址或数据赋值给标号,格式如下:标号操作码操作数字符名称EQU数或汇编符号例1AA EQUR1;R1与AA等值则MOVA,AA指令与MOVA,R1指令结果相同。(3)

DB定义字节指令

定义程序存储器中存放的8位常数表,格式如下:

(标号)操作码操作数

DB字节常数或ASCII字符例2ORG1000HDB76H,73,‘C’,‘B’;在表示ASCII字 符时要用‘’括号

DBOACH

则(1000H)=76H(1001H)=49H (1002H)=43H(1003H)=42H (1004H)=0ACH

(4)

DW定义字指令

定义程序存储器中存放的16位常数表

格式DW<16位数据表>。例3ORG2200HDW1246H,7BH,10

则(2200H)=12H(2201H)=46H

(2202H)=00(2203H)=7BH

(2204H)=00(2205H)=0AH(5)

BIT定义位地址指令

格式<字符名称>BIT<位地址>

例4ABCBITP1.0 Q4BITP2.2

则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。(6)

END汇编结束指令

7.DATA定义标号数值伪指令它的功能是给标号段中的数据地址标号赋以数值,也称为数据地址赋值指令。它的格式如下:字符名称DATA表达式例6M5DATA1A00H

汇编后M5的值为1A00H。8.DS定义存储空间指令它的功能是从指定地址开始,定义一个存储区,保留由表达式指定的若干字节空间作为备用空间,这个存储区预留的存储单元数由DS表达式的值决定。它的格式如下:

DS表达式 表达式通常是一个常数。例7ORG500H DS10HDB4BH,5AH

4.2顺序与循环程序设计

4.2.1顺序程序设计

例1将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码0~9为30H~39H。解:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。

源程序如下:地址机器码周期数源程序

ORG0000H0000H0202003LJMPMAINMAIN:200H78221MOVR0,#22202H76001MOV@R0,#0204HE5201MOVA,20H206HD61XCHDA,@R0207H4322302ORL22H,#30H20AHC41SWAPA20BH44301ORLA,#30H20DHF5211MOV21H,A20FH80FE2SJMP$END4.2.2循环程序设计

1.循环初态(或称初始条件)循环初态是设置循环过程中工作单元的初始值。

2.循环体重复执行的程序段部分。

3.循环控制部分。用于控制循环的执行和结束。

例3已知:80C51单片机使用的晶振为6MHz,要求设计一个软件延时程序,延时时间为10ms。解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为6MHz,则可知一个机器周期为2

s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:周期数

1MOVR0,#0AH;毫秒数

R01DL2:MOVR1,#MT;1ms延时的预 定值MT

R11DL1:NOP1NOP2DJNZR1,DL1;lms延时循环

2DJNZR0,DL2;毫秒数减1,不等于0,继续循环,等于0结束例4从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元ORG200HCLRA;清A作为初始最大值MOVR2,20H;数据个数初值MOVR1,#22H;数据块首地址初值LP:CLRC;清进位SUBBA,@R1;最大值减队列中数JNCNEXT;小于最大值继续SJMPNEXT1SUBBA,@R1;最大值减队列中数JNCNEXT;小于最大值继续SJMPNEXT1MOVA,@R1;大于最大值,则用此值代换NEXT:ADDA,@R1;小于最大值,则恢复NEXT1:INCR1;修改地址指针DJNZR2,LP;依次重复比较,直至R2=0MOV21H,A;最大值存入21H单元4.3分支程序设计4.3.1分支程序设计综述分支程序应用要点是正确使用转移指令,通常有如下3种指令。

1.无条件转移2.条件转移3.散转例3设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元

Y=3X,X<10Y=2X+10,10=<X=<15Y=40,X>154.3.2无条件/条件转移程序

ORG200HMOVA,5AHADDA,5AH;2X→A

MOVR1,AMOVA,5AH;重新把X装入ACJNEA,#10,L1L1:JCL2;X<10转L2MOVR0,#40;先假设X>15CJNEA,#10H,L3;与16比L3:JNCL4;X>15转L4MOVA,R1ADDA,#10;10≤X≤15,Y=2X+10

MOVR0,ASJMPL4L2:MOVA,R1ADDA,5AH;X<10,Y=3X

MOVR0,AL4:MOV5BH,R0;存结果

SJMP$END4.3.3散转程序设计

例2设有n个分支程序,n小于256,将n存放在R4中,设计散转程序。解:程序清单如下。

MOVDPTR,#TAB1;跳转表首地址送数据指针

MOVA,R4ADDA,R4 ;R4×2

A(修正变址值)

JNCNOAD;判有否进位

INCDPH;有进位则加到高字节地址NOAD:JMP@A+DPTR;转向形成的散转地址入口TAB1:AJMPOPR0;转移到分支程序OPR0AJMPOPR1…….AJMPOPRn

4.4子程序设计

4.4.1子程序结构与设计注意事项

子程序结构编写子程序时的注意事项在编写子程序时要注意以下几点:(1)要给每个子程序赋一个名字,实际上是一个入口地址的代号。(2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据如何得到。另外,要有出口条件,即处理的结果是如何存放的。(3)注意保护现场和恢复现场。4.4.2子程序的调用与返回

主程序调用子程序是通过子程序调用指令LCALLaddl6和ACALLadd11实现的。子程序的返回是通过返回指令RET实现的。主程序在调用子程序时要注意以下问题:(l)在需要保护现场的程序中,在主程序初始化时要正确地设置堆栈指针。(2)在主程序中,要安排相应指令,满足子程序的入口条件。(3)在主程序中,安排相应的指令,在子程序返回后,处理子程序提供的出口参数。4.4.3子程序设计举例

例1用程序实现c=a2+b2。设a、b均小于10。a存在31H单元中,b存在32H单元,把c存入33H单元。解:因本题二次用到平方值,所以在程序中采用把求平方的程序段编为子程序的方法。依题意编写主程序和子程序如下:

地址机器码源程序

ORG200H20075813FMOVSP,#3FH;设堆栈指针

203E531MOVA,31H;取a值

205120400LCALLSQR;求a2

208F9MOVR1,A;a2值暂存R1209E532MOVA,32H;取b值

20B120400LCALLSQR;求b220E29ADDA,R1;求a2+b220FF533MOV33H,A;存入33H

;子程序地址机器码源程序

ORG400H40004SQR:INCA40183MOVCA,@A+PC40122RET40314910TAB:DB0,1,4,9,16 408192431DB25,36,4940B40,51DB64,81例2P1.0端口输出1kHz和2kHz的变频音调,每隔1S交替变换一次。DLV:MOVR2,#08;

1kHz的持续时间DLV1:MOVR3,#0FAHDLV2:CPLP1.0;输出1kHz方波

LCALLD0.5ms;延时D0.5ms,省略

DJNZR3,DLV2DJNZR2,DLV1;持续1sDLV3:MOVR3,#0FAHDLV4:CPLP1.0;输出2kHz方波

LCALLD0.25msDJNZR3,DLV4DJNZR2,DLV3;持续1sSJMPDLV;反复循环4.5查表程序设计4.5.1查表程序综述

为了实现查表功能,在80C51汇编语言中专门设置了两条查表指令:

MOVC A, @A+DPTR MOVC A, @A+PC这2条指令特点不同,在应用时要注意区别。为了便于查表,要求表中的数或符号按照便于查找的次序排列,并将它存放在从指定的首地址(或称基地址)开始的存储单元。4.5.2规则变量的查表程序设计

规则变量X的值与表格中的Y值是一一对应的。Y值可以是单字节、双字节或三字节等,但所有的Y值必须具有相同的字节数。这样的表格具有规律,结构简单,便于编制查表程序。

例1设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG60HMOVA,R0ANLA,#0FH;保留低4位ADDA,#2;变址调整MOVCA,@A+PC;查表获取ASCII码值MOVR0,ARETTAB:DB30H,31H,32H,33H,34H,35HDB36H,37H,38H,39H,41H,42H,43H,44H,45H,46H4.5.3非规则变量的查表程序设计

如果X为非规则变量,即Xi并非是0~n中的所有数,对应某些正整数i,Yi=f(Xi)无定义,即在0~n区域中,仅有部分正整数与Yi有对应关系。例3设有一个80C51单片机控制系统,其输入参数X是非规则变量,Xi与Yi=f(Xi)的对应关系如表4-1。共存在m对对应关系,设m<256。表格的每一项由4个连续单元组成,这4个单元顺序存放X的高、低字节和Y的高、低字节。试编写查表子程序。表4-1非规则变量Xi与Yi的关系表

123…….…….m-1.mXi0002H0034H0734H…….…….…20DDH4AC4HYi00ADH0131H045DH…….………10AAH2CDBH

源程序如下:

MOVR2,#M1;设M1为对应关系数MOVDPTR,#TAB ;DPTR指向表格首地址

LP:CLRA ;清除AMOVCA,@A+DPTR ;取表中X高8位

CJNEA,20H,LP1 ;与X高8位比较,不等转

INCDPTR ;相等,指向X低8位地址

MOVCA,@A+D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论