




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章汇编语言程序设计教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:常用汇编语言程序设计方法。
教学难点:分支程序、散转程序与子程序的设计
汇编语言图5-1源程序、汇编程序、目的程序之间关系示意图
5.1概述程序设计语言:机器语言、汇编语言、高级语言机器语言不易识别和记忆,使用不便,很难用它来进行程序设计。5.1.1程序设计语言
4-1
汇编程序约定汇编语言程序:
用汇编语言编写的、完成特定功能的指令序列。汇编程序:
能将汇编语言源程序转换成机器语言目标程序的系统软件。
汇编语言程序到机器语言程序的转换过程称为汇编。1.手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。2.机器汇编:用汇编程序进行汇编。5.1.2汇编语言规范高级语言:一种面向过程且独立于计算机硬件结构的通用计算机语言汇编语言格式与伪指令1)汇编语言源程序由以下两种指令构成汇编语句(指令语句)伪指令(指示性语句)2)汇编语句的格式:
标号:
操作码
操作数 ;注释3)
伪指令:控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。
2.80C51汇编程序设计中常用的伪指令
(1)ORG汇编起始指令
规定目标程序的起始地址,格式如下:
标号操作码操作数
ORG表达式(exp)必须为16位地址(2)EQU赋值指令把操作数段中的地址或数据赋值给标号,格式如下:标号操作码操作数字符名称EQU数或汇编符号例1AA EQUR1;R1与AA等值则MOVA,AA指令与MOVA,R1指令结果相同。(3)DB
从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义8位数据常数表。 格式:操作码操作数
DB字节常数或ASCII字符例: ORG 1000H DB 34H,73,’A’,’B’ DB 0AH,0BH,20则(1000H)=34H(1001H)=49H(1002H)=41H(1003H)=42H(1004H)=0AH(1005H)=0BH
(1006H)=14H(4)
DW定义字指令
定义程序存储器中存放的若干个字的数据或ASCII码字符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表达式如MNDATA3000H;MN相当于3000HDATA与EQU的区别在于前者可以先使用后定义而后者不行,必须先定义才能使用。(8)DS定义存储空间指令功能:从指定地址开始保留DS之后表达式的值所规定的存储单元。格式:标号操作数
DS表达式例:P105例7判断框
连接点
图:常用流程图符号美国国家标准化协会ANSI(AmericanNationalStandardInstitute)设定了一些常用的流程图符号如图所示:起止框
或
流程线输入输出框
处理框5.1.3
汇编语言程序设计步骤一.分析工作任务、确定方案和计算方法二.了解应用系统的硬件配置、性能指标。三.建立系统数学模型,确定控制算法和操作步骤。四.画程序流程图表示程序结构和程序功能五.编制源程序1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读和修改调试和修改。开始1
YN?
5.2顺序与循环程序设计
5.2.1顺序程序设计(又称简单程序)既无分支,又无循环,按照顺序执行可完成一定的基本功能,是编写复杂程序的基础
常用程序结构:
顺序程序、循环程序、分支程序、查表程序、子程
例1:将一个字节内的两个BCD码拆开并变成ASCII码,存入两个RAM单元。BCD码放在内RAM的20H,转换后高半字节放到21H,低字节放22H。
BCDHBCDL00110011ROM21H22H20HBCD码0~9对应的ASCII码为30H~39H转换时,将20H中的BCD码拆开,高四位置为“0011”即可。BCDHBCDL上页下页回目录ASCII码即:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。
程序:0011BCDH00000000
MOVR0,#22HMOV@R0,#0MOVA,20HXCHDA,@R0ORL22H,#30HSWAPAORG1000HORLA,#30HMOV21H,ASJMP$END;R022H;22H0;两个BCD数送A;BCDL数送22H;完成转换;BCDH数送A的低4位;完成转换;存数BCDHBCDLBCDL00000011BCDHBCDLROM21H22H20H0000BCDH0011A上页下页回目录@R05.2.2
循环程序
包含多次重复执行的程序段,循环结构使程序紧凑。循环控制?循环工作循环结束循环初始化YN各个环节任务:一.初始化部分(循环初态)循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二.循环体循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分
处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。简单循环结构:循环体中不套循环。定时例2:试计算下列程序段执行时间。
程序
指令执行周期
MOVR7,#64H1TLOOP:NOP1TNOP1TDJNZR7,LOOP2T解:上述程序显然属于循环程序,其算法结构如图所示。循环次数100次,根据每条指令的执行周期可得每次循环消耗1+1+2=4(机器周期),加上第一条指令,整个程序段共计消耗时间为(4×100+1)T=401T,当晶振频率为6MHZ时,T=2μs,故上述程序实际消耗802μs。多重循环
循环体中套循环结构。以双重循环使用较多。软件延时程序。
用循环程序将指令重复多次执行,实现软件延时。试计算延时程序的执行时间。源程序 指令周期(M)指令执行次数DELAY:MOVR6,#64H 1 I1:MOVR7,#0FFH 1 I2:DJNZR7,I2 2 DJNZR6,I1 2 RET 2延时时间计算:(设时钟f=12MHz,M=1μs)t=(1×1+1×100+2×100×255+2×100+2×1)×M=51.3ms1100100×2551001习题:试计算延时程序的执行时间。 源程序 指令周期(M)指令执行次数DELAY:MOVR6,#100 1 D1:MOVR7,#10 1 D2:NOP 1
DJNZR7,D2 2 DJNZR6,D1 2 RET 2计算延时程序的执行时间(设时钟f=6MHz)。5.3分支程序设计5.3.1分支程序设计综述分支程序应用要点是正确使用转移指令,通常有如下3种指令。
1.无条件转移:与以执行程序的结果无关,只要给出正确的转移目标地址或偏移量即可2.条件转移:根据已执行程序对特殊或特定存储器的影响结果来决定程序的走向。3.散转:根据某种已输入的或运算的结果,是程序转到各个处理程序中
例3设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元
Y=3X,X<10Y=2X+10,10=<X=<15Y=40,X>155.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$END例4:空调机制冷时,若排出的空气温度比吸入的空气温度低8℃则认为工作正常,否则便认为是故障,并设置故障标志。解:为了可靠的监控空调机的工作情况,做两次减法:第一次(40H)-(41H),若CY=1,则肯定有故障;第二次两个温度的差值减去8℃,若CY=1,则肯定有故障程序的流程图如下:上页下页回目录首先定义一些工作单元内部RAM40H41H42H吸入温度值排出温度值故障标志A←(40H)-(41H)CY=1?(A)-8℃ENDSTARTYNCY=1?42H←FFH42H←0YN流程图:上页下页回目录故障正常
ORG1000HSTART:MOVA,40HCLRCSUBBA,41HJCERRORMOV42H,#0JCERRORSUBBA,#8SJMPEXITERROR:MOV42H,#0FFHEXIT:SJMP$END程序:;吸入温度值送A;0→CY;A←(40H)-(41H);CY=1,则故障;是则故障;温度小于8℃?;工作正常标志;转出口;设置故障标志若CY≠1顺序执行CY=1转移CY=1转移若CY≠1顺序执行上页下页回目录5.3.3散转程序设计
例5根据R3的内容,转向各个操作程序。
R3=0, 转入OPR0R3=1, 转入OPR1……….R3=n, 转入OPRn
解:程序清单如下。
MOVDPTR,#TAB1;跳转表首地址送数据指针
MOVA,R3;R3×2A(修正变址值)
ADDA,R3JNCNOAD;判有否进位
INCDPH;有进位则加到高字节地址NOAD:JMP@A+DPTR;转向形成的散转地址入口TAB1:AJMPOPR0;转移到OPR0AJMPOPR1……..AJMPOPRn5.4查表程序上页下页回目录对于复杂参数的计算如:非线性参数对数、指数、三角函数微分、积分等用汇编编程十分困难甚至无法建立数学模型用查表的方法简单容易80C51指令系统中有两条指令具有极强的查表功能(1)MOVCA,@A+DPTR作基址寄存器作变址寄存器长查表指令寻址64KB(2)MOVCA,@A+PC作基址寄存器作变址短查表指令页内查表指令指向表格首址指向表格的第i
项16位数据指针第i项加变址调整值不能例6:一个十六进制数放在HEX单元的低四位,将其转换成ASCII码查表程序:解:十六进制0~9的ASCII码为30H~39H,
A~F的ASCII码为41H~46H,
利用查表指令MOVCA,@A+DPTRMOVCA,@A+PC先用伪指令DB或DW把表格的数据存入ROM上页下页回目录来获得数据ASCII码表格的首址为ASCIITABASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46HEND上页下页回目录编程1:
0123
456789
ABCDEFORG0200HHEXEQU30HHEXASC:MOVA,HEXMOVDPTR,#ASCTABMOVCA,@A+DPTRMOVHEX,ARETANLA,#0FHDPTR(A)=333H(A)=1546H例1设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG30HMOVA,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,46H
5.5子程序设计一、子程序的概念把能完成某种基本操作并具有相同操作的程序段单独编成子程序。如:函数、±、×、运算、代码转换、延时等利用调用子程序指令(ACALL或LCALL)和从子程序返回指令RET使用子程序的优点⑴不必重复书写同样的程序,提高编程效率⑵程序的逻辑结构简单,便于阅读⑶缩短了源程序和目标程序的长度,节省了存储器空间⑷使程序模块化、通用化、便于交流共享资源⑸便于按某种功能调试上页下页回目录二、调用子程序的要点⑴子程序开头的标号段必须有一个标志,该标志既是子程序的名字又是其入口地址,以便主程序调用。在主程序中利用指令ACALL或LCALL可转入子程序。该指令具有保护断点的功能例如:调用延时子程序LCALL(ACALL)DELY⑵子程序结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能LCALLaddr16;PCaddr16转向子程序;(PC)(PC)+3;SP(SP)+1,(SP)PC7~0;SP(SP)+1,(SP)PC15~8;在调用子程序之前,保护断点地址RET;PC15~8((SP)),(SP)(SP)
-1;PC7~0((SP)),(SP)(SP)
-1主程序CALL断点子程序RET1、子程序的结构上页下页回目录子程序特点:功能上有通用性,结构上有独立性2、正确的参数传递在调用一个子程序时,主程序应先把有关参数放到某些约定的位置(如累加器、工作寄存器等),子程序运行时,可以从约定的位置得到有关参数。子程序结束前,也应把处理结果送到约定位置上页下页回目录3、子程序的通用性为了使程序具有一定的通用性,子程序的操作对象应尽量采用地址或寄存器形式,而不用立即数形式。4、现场保护
现场保护:
如果子程序使用的寄存器与主程序使用的寄存器有冲突,在转入子程序前,特别是进行中断服务子程序时,要进行现场保护。保护内容:主程序使用的内部RAM内容,各工作寄存器内容,累加器A和DPTR以及PSW等寄存器内容。保护方式:将要保护的单元压入堆栈。上页下页回目录中断保护时:还可以用RS1RS0来选择其他通用寄存器组,以便保护主程序现场。R0
~
R75.5.2子程序设计
例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+PC40222RET40314916TAB:DB0,1,4,9,16 408253649DB25,36,4940B64,81DB64,81子程序的嵌套子程序的嵌套:子程序中可调用其他子程序例如:数据处理程序如下...MAIN:MOVSP,#5FACALLRLC4...;定义堆栈指针;处理过程;调用子程序;↓上页下页回目录多重嵌套的过程SPSP*PC0L*PC0H*PC1L*PC1H5FH60H61H62H63H64H65H*PC2H*PC2L主程序
SUB1
SUB2
SUB3LCALLSUB1继续主程序*PC0断点入栈LCALLSUB2*PC1断点入栈SPSPLCALLSUB3*PC2断点入栈SPSPRETSPSP弹出断点RET弹出断点SPSPRET弹出断点SPSP上页下页回目录栈底子程序与主程序的概念是相对的,在一个子程序中又可调用其它子程序,这就是子程序的多重嵌套。堆栈的设置是十分重要的例1
多字节无符号数减法子程序NSUB功能:n字节无符号数减法入口:(R0)=被减数低字节指针(R1)=减数低字节指针(R7)=字节数n出口:(R0)=差数高字节地址指针解:若被减数大于减数,则差为正数;若被减数小于减数,则差为补码数(负数),且差数为n字节上页下页回目录5.6综合编程举例
流程图:0←CY
((R0))-((R1))-CY→(R0)RETNSUB(R7)-1=0?修改地址指针(R0)+1→R0,(R1)+1→R1NNSUB:CLRCLOOP:
MOVA,@R0NOPMOV@R0,ASUBBA,@R1INCR0INCR1DJNZR7,LOOPDECR0RET程序:上页下页回目录例2
双字节无符号数快速乘法子程序MULD功能:双字节无符号数乘法,积为32位入口:
(R7R6)=
被乘数ab(R5R4)=
乘数cd(R0)=
有定义的内部RAM地址出口:
(R0)=
乘积的高字节地址指针解:于两个双字节无符号数相乘,用8位乘法指令来完成需要四次,每次的乘积为16位,会产生4个部分积,共需要8个单元存放,然后再按“位权”相加,和即为所求之积。这样所占存储单元太多,应该采用边乘边加的方法。用R3、R2、R1作暂存器或工作单元。上页下页回目录R6
bR7
aR4
dR5
c编程思路与手乘法相似:被乘数乘数上页下页回目录R6
bR4
dbdHbdLR7
aadHadLR5
cbcLbcHacLacHbdLacHbdH
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年煤矿自动化控制系统合作协议书
- 2024CFA考试难点试题及答案解析
- 高校景观说课
- 急速备考CFA试题及答案
- CFA考试成功要素试题及答案
- 多元化投资组合的构建技巧试题及答案
- 学习规划的CFA试题及答案步骤
- 集团年度工作总结
- 针对学员的2024CFA考试试题及答案
- 实事求是红色教育
- 2024年内蒙古气象部门招聘呼和浩特包头鄂尔多斯等考试真题
- 炎德·英才大联考长郡中学2025届高三3月月考试卷(七)地理试卷(含答案详解)
- 脑梗死合并慢阻肺的护理查房
- T-CPI 11037-2024 石油天然气钻采设备水力振荡器技术与应用规范
- 2025年临床医师定期考核必考复习题库及答案(900题)
- 张成福《公共管理学》(修订版)课后习题详解
- 2024年全国版图知识竞赛试题及答案(中小学组)
- BrownBear绘本附配音PPT课件
- 供电局配电网设备缺陷管理标准(试行)_图文
- 一元立木材积表
- 4S店三表一卡标准模板
评论
0/150
提交评论