第三章 汇编程序设计.docx

上传人:b****6 文档编号:13604052 上传时间:2023-06-15 格式:DOCX 页数:25 大小:44.26KB
下载 相关 举报
第三章 汇编程序设计.docx_第1页
第1页 / 共25页
第三章 汇编程序设计.docx_第2页
第2页 / 共25页
第三章 汇编程序设计.docx_第3页
第3页 / 共25页
第三章 汇编程序设计.docx_第4页
第4页 / 共25页
第三章 汇编程序设计.docx_第5页
第5页 / 共25页
第三章 汇编程序设计.docx_第6页
第6页 / 共25页
第三章 汇编程序设计.docx_第7页
第7页 / 共25页
第三章 汇编程序设计.docx_第8页
第8页 / 共25页
第三章 汇编程序设计.docx_第9页
第9页 / 共25页
第三章 汇编程序设计.docx_第10页
第10页 / 共25页
第三章 汇编程序设计.docx_第11页
第11页 / 共25页
第三章 汇编程序设计.docx_第12页
第12页 / 共25页
第三章 汇编程序设计.docx_第13页
第13页 / 共25页
第三章 汇编程序设计.docx_第14页
第14页 / 共25页
第三章 汇编程序设计.docx_第15页
第15页 / 共25页
第三章 汇编程序设计.docx_第16页
第16页 / 共25页
第三章 汇编程序设计.docx_第17页
第17页 / 共25页
第三章 汇编程序设计.docx_第18页
第18页 / 共25页
第三章 汇编程序设计.docx_第19页
第19页 / 共25页
第三章 汇编程序设计.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第三章 汇编程序设计.docx

《第三章 汇编程序设计.docx》由会员分享,可在线阅读,更多相关《第三章 汇编程序设计.docx(25页珍藏版)》请在冰点文库上搜索。

第三章 汇编程序设计.docx

第三章汇编程序设计

第3-1讲第3章单片机汇编语言程序设计

【课  题】MCS-51汇编语言编程

【授课方法】在专业教室讲授,举例说明汇编语言编程应用。

【目的要求】了解本课程汇编语言编程的基础知识;

理解MCS-51汇编语言编程方法;

掌握MCS-51汇编语言编程相关规定和硬件知识。

【重点难点】灵活运用与编程有关的规定。

【教学过程】1、复习2、程序设计的重要性3、程序设计方法

汇编语言程序设计

微型机应用离不开应用程序的设计。

单片机程序设计多采用汇编语言编写。

本章介绍MCS51系统汇编语言程序编写的一般知识:

有关规定、习惯用法、常见程序结构和编程方法。

要学会编写程序应掌握编程的一般知识,还要分析一些经典程序,从修改现有程序入手,先简后难,循序渐进,最后达到自已设计应用系统和编写程序的目的。

3.1单片机汇编程序设计方法与流程

3.1.1汇编语言程序设计步骤

用汇编语言编制程序的过程,称为汇编语言程序设计。

通常,汇编语言程序设计的步骤如下:

整个汇编程序设计的流程图见图3.1,当然、短小程序可能不要这么复杂。

1、设计规划,建立数学模型

设计前对项目作评估和规划,程序功能、运算精度、执行速度、各硬件特点、掌握设计的重点和难点。

2、选择适当的算法

对于同一个任务,往往可用不同的程序实现。

此时应结合所用机器的指令系统,对不同的算法进行分析比较,经各方面综合考虑选择一种最佳算法,使程序精简,且执行速度快。

3、程序结构的设计

程序结构设计是把所采用的算法转化为汇编语言程序的准备阶段,特别是对于情况复杂的大型课题,必须进行程序结构设计。

它可以分为模块化程序设计、结构程序设计及自顶向下设计等。

4、编制汇编语言程序

根据确定的算法及所选用的程序结构就可以绘制流程图,根据流程图并结合所选用的指令系统就可写出相应的汇编语言源程序。

5、汇编语言程序的调试

汇编语言程序编好后必须进行调试,因为所编制的程序难免有错误,且程序需要优化。

3.1.2编制程序的流程图

1、程序流程图的作用

采用流程图表示法,可以直观形象地表示各部分的逻辑关系及程序结构。

方便地发现和分析程序算法存在的错误,便于掌握和进行交流。

所以,流程图是程序设计的重要工具。

2、程序流程图的组成

程序流程图是用几何图形配以文字说明来描述程序的。

它不但形象地描述程序执行的过程而且清楚地表达程序结构的内在联系。

流程图中所采用的各种常用符号如下:

(1)端点图

它是一个圆形框(如图3.2中开始和结束)表示程序的起止等相应的文字

(2)流程线

流程线如图3.2线条所示,它表示程序执行的流向。

(3)处理框

处理框如图3.2所示,该框表示一种处理功能或者程序执行的过程。

框内用文字简要说明一段程序的功能或处理过程。

(4)判断框

判断框如图3.2所示,该框用于指示一个判定点,从这点产生分支。

在框内应注明测试条件,而测试结果则注明在各分支流程线上。

(5))子程序框

子程序框如图3.2所示,该框表示调用子程序,在该框内填入相应的子程序名称或入口地址。

如果要解决的问题较为复杂,通常设计“粗细”不同的程序流程图。

首先设计粗图框,力求反映编程者的总体设计思想及总体结构并侧重于模块之间的相互联系;然后设计详细框图,此时应侧重各个模块的具体实现。

当然、一个简单的程序也可直接写出,但要成为一个优秀的设计人员,开始就要养成良好的习惯,掌握大量的设计素材,学习他人经验。

3.1.3单片机程序结构

1伪指令

用汇编语言编写的程序通常需经过微机汇编变成机器码才能被执行。

为了对源程序汇编,在源程序中必须使用一些“伪指令”。

伪指令是便于程序阅读和编写的指令,它即不控制机器的操作也不能被汇编成机器代码,只为汇编程序所识别的常用符号,并指导汇编如何进行,故称为伪指令。

已是大家公认的习惯用法,MCS-51系列单片机的常用伪指令如下:

1)、起始地址伪指令ORG

起始地址伪指令ORG是用来规定目标程序段或数据块的起始地址。

通常,在汇编语言程序开始处均用ORG伪指令指定程序存放的起始地址。

2)、汇编结束伪指令END

汇编结束伪指令END是用来告诉汇编程序,此源程序到此结束。

在一个程序中,只允许出一条END语句,而且必须安排在源程序的末尾。

否则,汇编程序对END语句后的所有语句都不进行汇编,

3)、赋值伪指令EQU

赋值伪指令EQU用于告诉汇编程序,将该伪指令右面的值赋给左面用户定义的符号,其格式如例题。

由EQU赋值的字符名称在源程序中可以作为数值使用,也可以作为数据地址、代码地址或位地址。

由EQU伪指令所定义的符号必须先定义后使用。

故该语句通常放在程序开头处。

例3.1

BUFFEREQU58H;BUFFER的值是58H

BLOCKEQUADDER;将标号ADDER赋值给字符名称BLOCK

ORG4000H;该语句下面的程序从4000H开始

4000HE5F0START:

MOVA,B

4002H30E7JNBACC.7,DONE

4004HF4CPLA

4005HF5FODONE:

MOVB,A

4007HF558MOVBUFFER,A

END

4)、定义字节伪指令DB

定义字节伪指令DB是用于告诉汇编程序从指定的地址单元开始定义若干个字节存储单元的内容。

其格式见练习二。

5)、定义字伪指令DW

定义字伪指令DW是用来告诉汇编程序从指定的地址单元开始,定义若干个16位数据。

其格式如DB用法相同,只是一次定义16位数。

由于一个字长为16位,故要占两个存储单元。

在MCS-51单片机系统中,16位的高8位存入低地址单元,低8位存入高地址单元。

6)、数据地址赋值指令DATA

数据地址赋值伪指令DATA是用于告诉汇编程序,把由表达式指定的数据地址或代码地址赋予规定的字符名称.

DATA伪指令的功能是和EQU指令相似,但DATA伪指令所定义的符号可先使用后定义。

在程序中它常用来定义数据地址,该语句一般放在程序的开头或末尾。

7)、位地址赋值伪指令BIT

位地址赋值伪指令BIT是用于告诉汇编程序,把位地址赋予规定的字符名称,常用于位处理的程序中,

机器汇编通常是在PC机上用软件MedWin/QTH-8052F/EDIT等编辑,用编程器将程序固化在芯片内,供单片机运行。

3.1.4汇编语言源程序人工汇编

1、汇编程序的汇编过程

用汇编语言编写的源程序必须通过汇编程序的汇编,才能使源程序转换成相应的由机器码指令组成的目标程序。

较长的程序一般采用微机汇编,短小程序或练习程序也用手工汇编。

2、人工汇编

在单片机配套的计算机系统上,一般都配备汇编程序,其它微机需另外安装相应的软件,对于简单的实验程序可进行人工汇编,还会有一定好处,学生根据指令表一条条地将汇编语言程序的语句翻译成机器码指令,放到相应的地址,最后得到可运算的目标程序。

练习一二次后可掌握基本方法,本书中的练习有的给了机器码,有的没给,大家可参考、练习汇编。

3-2单片机汇编语言程序设计

【课  题】MCS-51汇编语言程序设计初步

【授课方法】在专业教室讲授

【目的要求】了解本课程汇编语言编程的基础知识;

理解MCS-51汇编语言编程方法;

掌握MCS-51汇编语言顺序、分支、循环、子程序结构

【重点难点】编程相关的技巧很多、全面掌握难度较大。

【教学过程】复习、单片机汇编语言编程初步、顺序、分支程序

【教学内容】

3.2单片机汇编语言程序设计初步

前面我们已学习了几个小程序,对程序有了初步了解,知道汇编语言是面向机器语言。

单片机汇编语言程序设计与所使用的机器的内部结构都有密切的关系。

必须充分了解所使用机器的“硬件环境”,才能着手进行汇编语言程序设计。

特别是在编制I/O接口程序时还需了解I/O接口电路、机器及外设的外特性。

为了设计一个高质量的程序,必须掌握程序设计的一般方法。

在汇编语言程序设计中,普遍采用结构化程序设计方法。

采用这种设计方法的主要依据是任何复杂的程序都可由顺序结构、分支结构及循环结构程序等构成。

每种结构只有一个入口和出口,整个程序也只有一个入口和出口。

结构程序设计的特点是程序的结构清晰、易于读写、易于验证、可靠性高。

下面主要介绍结构化程序设计的基本的程序设计方法。

3.2.1、顺序程序设计

1、顺序结构

顺序结构是程序结构中最简单一种。

用程序流程图表示时,是一个处理框紧接着一个处理框。

在执行程序时从第一条指令开始顺序执行直到最后一条指令为止。

例3.2设有16位二进制数存放在8031单片机内部RAM的50H及51H单元中,要求将其算术左移一位(即原数各位均向左移1位,最低位移入0)后仍存放在原单元。

试编制相应的程序。

(5672H=0101011001110010→1010110011100100=ACE4H)

分析:

由于MCS-51系列单片机的指令系统只有8位二进制数的算术移位指令,而无16位二进制数的算术移位指令。

因此,要实现16位数的算术左移1位,只能分两次进行。

开始时将进位标志C清0,先进行低8位带进位循环左移,将低8位中的原最高位移至C,而C原来的0移至最低位。

然后进行高8位带进位循环左移,原低8位中最高位经C移至高8位中的最低位。

这样就实现了16位二进制数算术左移一位。

程序如下:

4000ORG4000H

4000C3BIHROL:

CLRC;C清0

4000E551MOVA,51H;低8位左环移一位

400333RLCA

4004F551MOV51H,A

4006E550MOVA,50H,;高8位左环移一位

400833RLCA

4009F550MOV50H,A

400BEND

本程序共有7条指令占用11个字节的程序存储空间。

例3.3设在8031单片机内部RAM的40H单元中存放一个8位二进制数,请将其转换成相应的BCD码并由高位到低位顺序存入内部RAM以60H为首址的3个连续单元中。

试编写相应的程序。

注:

单片机指令默认的数是十六进制,大家日常用十进制。

分析:

要求是:

80H=128D→01/02/08或0F3H=243D→02、04、03

由于51系列单片机的指令系统中有除法指令,故它的转换可用运算实现。

先将此数除以100,其商即为百位数;再将余数除以10,其商即为十位数,而此时的余数即为个位数。

程序如下:

ORG4000H

BINBCD:

MOVRO,#60H;设置存数地址指针R0初值

MOVA,40H;取被转换的二进制数

MOVB,#100;置除数为100或64H

DIVAB;除以100,求百位数

MOV@RO,A;将百位数指定单元

INCRO;修改指针

MOVA,#10;置除数为10

XCHA,B

DIVAB;除以10,求十位数

MOV@RO,A;将十位数指定单元

INCRO;再次修改指针

XCHA,B;A中为个位数

MOV@RO,A;送个位数

END;结束

例3.4设在8031单片机的外部RAM的60H单元存有1字节代码,要求将其分解成两个4位字段。

高4位存入原单元的低4位,其低4位存入61H单元的低4位且要求这两单元的高4位均为0。

试编制相应的程序。

把一个字节数这样做以便送到两个数码管显示。

分析:

本题的实质是进行字节分解,可用ANL和SWAPA指令来实现。

源程序如下:

ORG4000H

DEMODE:

M0VP2,#00H;

MOVRO,#60H;设置地址指针RO初值

MOVXA,@RO;取数

MOVB,A;暂存以备用

ANLA,#0F0H;截取高4位

SWAPA;高4位为0,低4位为60H单元中的低4位

MOVX@RO,A;送结果1

ANLB,#0FH;截取低4位

MOVA,B;高4位为0,低4位为60H单元中的低4位

INCRO;修改指针

MOVX@RO,A,;送结果2

END;结束

3.2.2分支程序设计

1、分支结构

计算机具有逻辑判断能力,它能根据条件进行判断并根据判断结果选择相应的程序入口。

这种逻辑判断功能是计算机分支程序的基础。

在进行编程时常常会遇到:

根据不同的条件,要求进行相应的处理,此时就应采用分支结构。

通常用条件转移指令形成简单分支结构。

指令JZJNZ、JC,JNC、JB、JNB、CJNE、DJNZ等都可以作为程序分支的依据。

另外,在MCS-51指令系统中还有一类指令JMP@A+DPTR稍后再讲。

2、分支程序设计

例3.5设a存放在累加器A中,b存放在寄存器B中,要求按下式计算y值并将结果y存入累加器A中。

试编制相应的程序。

分析:

本题的关键是判断a是正数还是负数,这可以通过检测a的符号位(最高位)的状态来实现。

若ACC.=7(a为正数),则执行a-b运算;否则,执行a+b运算。

程序如下:

ORG4000H

BRMPNA:

JBACC.7,PLUS;a为负数?

若是则转PLUS

CLRC;若为正数,则清C

SUBBA,B;执行a-b操作

SJMPBRDONE、

PLUS;ADDA,B;若为负数,则执行a+b操作

BRDONE:

SJMPBRDONE;等待

END;结束

例3.6两个带符号数分别存在ONE和TWO两单元。

试比较它们的大小,将较大者存入MAX单元中。

分析:

两个带符号数的大小比较,可将两个数相减后的正负数和溢出标志结合在一起判断,即:

当x-y>0为正时,若OV=0,则x>y;如果OV=1,则x

当x-y<0为负时,若OV=0,则xy。

当x-y=0,则x=y.

程序如下:

ORG4000H

COMP:

CLRC:

做减法,清Cy

MOVA,ONE;取x到A中

SUBBA,TWO;x-y

JZXMAX;x=y?

JBACC.7,NEG;x-y<0,转NEG

JBOV,YMAX;x-y>0,OV=1,则y>x

SJMPXMAX;x-y>0,OV=0,则x>y

NEG:

JBOV,XMAX;x-y<0,OV=0,则x

YMAX:

MOVA,TWO;y>x

SJMPRMAX

XMAX:

MOVA,ONE;x>y

RMAX:

MOVMAX,A;存最大值

RET

ONEDATA30H;数据地址

TWODATA31H

MAXDATA32H

END

3-3单片机汇编语言程序设计

【课  题】MCS-51汇编语言编程-循环结构与循环程序、子程序

【授课方法】在专业教室讲授,举例说明、分析程序

【目的要求】了解本课程汇编语言编程的基本方法和技巧;

理解MCS-51汇编语言编程方法,注总事项;

掌握常见的几种程序设计方法。

【重点难点】单片机汇编程序设计。

单片机程序例题深入分析。

【教学内容】

练习四、循环结构与循环程序设计

4.1、循环结构程序

前面介绍了顺序程序和分支程序,对于前者每条指令只执行一次,后者则根据不同条件会跳过一些指令,执行另一些指令。

这两种程序的特点是每条指令至多只执行一次。

但是,在处理实际问题时,有时要求某些程序段多次重复执行,此时就应采用循环结构实现。

这样不但可使程序简练而且可大大节省存储单元、典型循环程序包含四部分:

初始化部分、循环处理部分、循环控制部分和循环结束部分。

下面分别介绍这四个组成部分。

(1)初始化部分

(2)循环处理部分

(3)循环控制部分

(4)结束部分

*例3.9设有一带符号的数组存放在8031单片机内部RAM以20H为首址的连续单元中,其长度为90,要求找出其中的最大值将其存放到内部RAM的1FH单元中,试编写相应的程序。

分析:

开始时将第一单元内容送A,接着从第二位起依次将其内容x与A比较,如x>A,那么将x送A;如果A≥x,那么A值不变,直到最后一个单元内容与A比较、操作完毕,则A中就是该数组中的最大数,这里需要解决如何判别两个带符号数A,x的大小。

通常可以采用如下的方法:

首先判断A,x是否是同号,若是同号,则进行A-X操作,如差>0,那么A>X;如果差<0,那么A

如为正,则A(或x)>X(或A);如为负,则A(或x)

相应的流程图。

程序如下:

ORG1000H

SCMPPMA:

MOVRO,#20H;置取数指针R0初值

MOVB,#59H;置循环计数器B初值

MOVA,@RO;第一个数送A

SCLOOP:

INCRO;修改指针

MOVR1,A;暂存

XRLA,@RO;两数符号相同?

JBACC.7,RESLAT;若相异,则转RESLAT

MOVA,R1;若相同,则恢复A原来值

CLRC;C清0

SUBBA,@R;两数相减,以判两者的大小

JNBACC.7SMEXT1;若A为大,则转SMEXT1

CXAHER:

MOVA,@RO;若A为小,则将大数送入A

SJMPSMEXT2

RESLAT:

XRLA,@RO;恢复A原值

JNBACC.7SMEXT2;若A为正,侧转SMEXT2

SJMPCXAHER;若A为负,则转XCAHER

SMEXT1:

ADDA,@RO;恢复A原值

SMEXT2:

DJNZ,B,SCLOOP;所有的单元均比较过?

未比较完,则继续进行

MOV1FH,A;最大者送1FH单元

END

②循环次数未知的循环程序

有些程序事先不知道循环计数器,这时需要根据判断循环条件的成立与否,或用建立标志的方法,控制循环程序的结束.

(2)多重循环设计

前面例子都是单循环程序。

在现实中往往还会遇到多重循环,一个循环程序的循环体中还包含一个或多个循环的结构,即双重循环或多重循环。

例3.10设8031单片机使用12MHz晶振(机器周期T为lµs),试设计延迟100ms的延时程序。

前面程序中已用过这样的程序,这里详细分析如下:

延时程序的功能相当于硬件定时器的功能。

延时程序的延迟时间就是该程序的执行时间为512T(0FFH*2=512)。

若取每条指令执行时间是T=1us(12MHZ),则最长的延时为512µs,故可采用双重循环程序实现延时100ms。

程序如下:

ORG4000H指令延时

DEYPRG:

MOVR2,#COUNTS;置外循环计数器R2初值为COUNTS,如#0FFH1μs

LOOPS:

MOVB,#COUNTR;置内循环计数器B初值为COUNTRCOUNTS﹡2μs

LOOPR:

DJNZB,LOOPR;内循环计数并判内循环结束否?

COUNTR*COUNTS﹡2μs

DJNZR2,LOOPS;外循环计数并判外循环结束否?

COUNTS﹡2μs

END

下面计算COUNTR及COUNTS的值。

设内循环程序的延时为500us,则COUNTR*2μs=500μs

于是可得COUNTR=250=0FAH,

外循环程序要求执行时间为100ms,则1μs+(500+2+2)μs*COUNTS=100000μs

可得COUNTS=198.8取199=0C7H。

此延迟程序的实际延迟时间为

[1+(502+2)*199]*1us=100.098ms把每条指令执行次数乘指令周期即为总延时。

例3.11设在单片机8031内部RAM的数据缓冲区存放一无符号数数组,其长度为100,起始地址为30H。

要求将它们从大到小顺序排列,排序后存放在原数据缓冲区中,试编写相应的程序。

程序如下:

ORG4000H

BUBBLE:

MOVRO,#30H;置地址指针RO初值

MOVR2,#100;置长度计数器R2初值#64H

CLR10H;交换标志位(10H单元)清0

DECR2;长度计数

BULOOP:

MOVA,@RO;取比较的第一个数

MOV20H,A;暂存

INCRO;修改指针R0,以指向下一单元

MOV21H,@RO;取数比较的第二个数

CJNEA,21H,BUNEU;两个比较,若(20H)-(21H),转BUNEU

BUNEU:

JNCBUNEXT;若(20H)≥(21H),则转BUNEXT

MOVA,@RO;若(20H)<(21H),则两者交换

MOV@RO,20H;(20H)的数小送高地址

DECRO

MOV@RO,A;(21H)数大送低地址

INCRO;恢复RO原值,准备下一次比较。

SETB10H;置交换标志位为1

BUNEXT:

DJNZR2,BULOOP;长度计数器为0?

若不为0,则继续比较

JB10H,BUBBLE;判交换标志。

若为1,则继续循环

END;为0则循环结束,完成排序

3.5.1、子程序结构

在程序设计的实践中,经常会遇到在不同的程序中或在同一程序不同的地方,要求实现某些相同的操作,如延时、代码转换、数制转换、检索与排序、函数计算以及对某些外设的实时控制等。

例3.15十六进制数的ASCII码转换成相应的十六进制子程序SUBASH。

十六进制的ASCII码值不是连续的:

0~9的ASCII码为30~39H此时只要将ASCII码值减去30H即可得到相应的十六进制数;而0AH~0FH的ASCII码为41H~46H,此时要将ASCII码值减去37H才是相应的十六进制数。

由于本程序是子程序,所以(SP)及(SP)-1所指示的是返回地址,而(SP)-2所指示的才是欲转换的ASCII码,SUBASH子程序流程大家分析程序后自己画出。

;子程序名称:

SUBASH

;入口参数:

被转换的十六进制数的ASCII码存放在(SP)-2所指示单元中

;出口参数:

转换后的十六进制数仍放在原单元中

;所用寄存器:

A,RO

;子程序清单:

SUBASH:

MOVRO,SP;SP值不能改变,否则不能正确返回

DECRO

DECRO

XCHA,@RO;从堆栈取出被转换的数送A

CLRC

SUBBA,#3AH;为0~9的ASCII码否?

小于3AH?

共减30H

JCASCDTG;若是小于,则转ASCDTG

SUBBA,#07H;若否,则再减去7,(A)-3A-7+0A=(A)-37

ASCDTG:

ADDA,#0AH;转换成十六进制数,

XCHA,@RO;转换后的十六进制数压入堆栈

RET

调用程序设计见下例。

例3.16设有50个十六进制数的ASCII码存放在8031单片机内部RAM以30H为首址的连续单元中。

要求将其转换成相应的十六进制数并存放到外部RAM以4100H为首址的25个连续单元中。

根据上述要求,试编制SUBASH子程序的调用程序。

相应的程序如下:

ORG4000H

MAIASH:

MOVRO,#2FH;置取数指针RO初值,从30H开始

MOVDPTR,#40FFH;置数据指针DPTR,下一个地址是4100H

MOVSP,#20H;置堆栈SP初值

MOVR2,#19H;置循环计数器R2初值25

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2