mcs-51汇编措辞法度模范设计_第1页
mcs-51汇编措辞法度模范设计_第2页
mcs-51汇编措辞法度模范设计_第3页
mcs-51汇编措辞法度模范设计_第4页
mcs-51汇编措辞法度模范设计_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章51单片机汇编语言程序设计 5.1 汇编语言源程序的格式 伪指令 5.3 汇编语言源程序的人工汇编5.4 MCS-51汇编语言程序的基本结构与设计举例宝娘撇仗驳更豁蛮跃攻勤膘古椿陡灭峰陡拢迟伍瘤桔先迁非盐粕变遣厕柬MCS-51汇编语言程序设计MCS-51汇编语言程序设计1引言计算机能够直接执行的是:0和1组成的机器码指令程序。上一章在讲解指令时的程序,其特点是:1、指令是采用助记符,而不是用机器码表示;2、地址是采用标号地址(符号地址),而不是真正的实际地址。汇编语言源程序:用助记符和标号地址编写的程序。汇编语言面向机器,要经过汇编。高级语言面向算法、过程、对象,类似自然语言,可移植性好

2、,须经解释或翻译后才能被执行。庄墓雅嚣机徐槐矗型卫熙歹夷锭醛事坝米迹瞬阻龋蚤诅窄隐泳波臂浪搞疾MCS-51汇编语言程序设计MCS-51汇编语言程序设计2汇编汇编机器语言目标程序汇编语言源程序汇编程序汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。(可人工汇编或机器汇编) 汇编程序:能将汇编语言源程序转换成机器语言目标程序的软件称为汇编程序。(机器汇编)惶翔艘剃现钧哗专棵滴灌骡们赔确趾萌褪锥雌哩缚蜘销衫柴骑仲砖换住对MCS-51汇编语言程序设计MCS-51汇编语言程序设计35.1 汇编语言源程序的格式 MCS-51的汇编语言的四分段格式如下: 标号: 操作码 操作数;注释规则:(1)

3、标号字段和操作字码段之间要有冒号“:”相隔;(2)操作码字段和操作数字段间的分界符是空格;(3)多操作数之间用逗号相隔; (4)操作数字段和注释字段之间的分界符用分号“;”相隔。操作码字段为必选项,其余各段为任选项。例如: START: MOV A,#00H ;0A NOP幢揭昭吓钥苗语闷媒檬疆蹈酉卿洋掘荫玻梨皱凡萝威嫌叁楞埂作暴伤炸皮MCS-51汇编语言程序设计MCS-51汇编语言程序设计4基本语法规则:1标号 是语句所在地址的标志符号。命名规范如下:(1)由18个字母、数字与下划线“-”组成;(2)首字符为字母;(3)同一标号在一个程序中只能定义一次; (4)绝对不允许把指令的保留字、寄存

4、器及伪指令字符作为语句的标号。2操作码字段 是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。 操作码段也可以是伪指令的助记符,在汇编时起作用。逐匿肆欺姓酬蹭刘滤记恨踊苹滇洱劈奶世谩愉辛冗疽泣迷斯酪山址镀敷令MCS-51汇编语言程序设计MCS-51汇编语言程序设计5基本语法规则23操作数可以采用字母或数字等多种表示形式。操作数是立即数,可用二进制、十进制和十六进制形式:十六进制,后缀“H” 。 二进制,后缀“B” 。十进制,后缀“D”,也可省略。 若十六进制的操作数以字符AF中的某个开头时,则需在它前面加一个 “0”,以便在汇编时把它和字符AF区别开来。 注意数字前

5、加“#”。 带加、减运算符的表达式: 例如:MOV A, #100-1蔼贺暴捞曝区倍裕瘫粉缓掐心靖盐镍屿晒蝴张刀隧珍哄辑剩隧溺藕线贪权MCS-51汇编语言程序设计MCS-51汇编语言程序设计6基本语法规则3 对于直接地址direct,有多种选择: (1)直接数据地址(各种进制),如MOV A、30H等; (2)标号地址,如MOV A,SUM等, SUM应该在程序中某处加以定义; (3)带有加减的表达式,设SUM为已定义的标号地址, 如MOV A,SUM十13; (4)特殊功能寄存器名,如MOV A,P2等。4、 注释段:注释指令或程序的含义,便于阅读程序、维护程序。 必须用“;”隔开,续行时,

6、也必须以“;”开头 。侧倍寝舞轨莽晴博摧珍邢龚霍烃饭墅融凸耍颠决象妓峨羔屁辊鹤龙肘砧驱MCS-51汇编语言程序设计MCS-51汇编语言程序设计7基本语法规则4美元符号$的使用用于表示该转移指令操作码所在的地址。例如,如下指令: JNB F0, $与如下指令是等价的:HERE:JNB F0,HERE 涤曼办括霉锦棠晤跳衔特啼桨彦乘挖诫碗撞锨煌驱泼谣番筑蜘辉墟绅粥挨MCS-51汇编语言程序设计MCS-51汇编语言程序设计8 伪指令 只有在汇编前的源程序中才有伪指令。经过汇编得到目标程序(机器代码)后,伪指令已无存在的必要,所以“伪”体现在汇编时,伪指令没有相应的机器代码产生。 伪指令是告诉汇编程序

7、,如何汇编源程序的指令。不属于指令系统中的指令。 用来对汇编过程进行某种控制,或者对符号、标号赋值。 不同版本的汇编语言,基本用法类似,但稍有不同。腻气甥岩蹬付版尔缄批面啥牟追迄邻迷嘛哮蓝皇邑鹰脓青挪单脐沉浪自壮MCS-51汇编语言程序设计MCS-51汇编语言程序设计9伪指令(1)起始地址伪指令功能:用于设定目标程序段或数据块的起始地址。注意:地址从小到大,且不能重叠。它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是伪指令中的16位绝对地址或用标号、表达式表示的地址。一般默认从0000开始。 例如: ORG 2000HSTART: MOV A, #

8、7FH 它表明标号为START的目标程序是从2000H单元开始存放的。格式: 标号: ORG 16位地址 嗽鹰榆卯蚕旭腹枪玩速卷僻凋烘勾嫡尽汛瞬戚培需氯琐森霜目求组裕捐羽MCS-51汇编语言程序设计MCS-51汇编语言程序设计10(2)定义字节伪指令 DB格式: 标号: DB 8位数据表功能:用于从指定的地址开始,在程序存储器的连续单元中定义字节数据。8位数表可以是一字节常数或字符,或用逗号分开的字节串,或用引号括起来的字符串。 例如: ORG 2000H TAB1: DB 30H, 8AH, 7FH, 73 DB 5, a, BCD30H2008H8AH2007H7FH2006H49H200

9、5H35H2004H61H2003H42H2002H43H2001H44H2000H由于ORG 2000H,所以TAB1的地址为2000H,因此以上伪指令经汇编以后,将对2000H开始的若干内存单元赋值。靖么琅普鼎册办茹读传模堡利贵涸洪宵康瘴梅骗仗忽颖傅遥赎嚼匪咸垛慧MCS-51汇编语言程序设计MCS-51汇编语言程序设计11(3)定义数据字伪指令 DW格式: 标号: DW 16位数据表 功能:用于从指定地址开始,在程序存储器的连续单元中定义16位的数据字。存放时,数据字的高8位在前(低地址),低 8位在后(高地址)。例如,DW“AA”;存入41H,41HDW“A” ;存入00H,41HDW“

10、ABC”; 超过两字节,不合法DW 100H, 1ACH, -804;按顺序存入01H、00H、01H、0ACH、0FCH、0DCH辖裕榔厢因婆簇舷偿圣朔逮搔拔耍绸呀竖梆雾涟蛾郭冠式揩备赵扶柯考邦MCS-51汇编语言程序设计MCS-51汇编语言程序设计12例如: ORG 1500H TAB2: DW 1234H, 80H汇编以后: (1500H)=12H(1501H)=34H(1502H)=00H(1503H)=80H。12H1503H34H1502H00H1501H80H1500H镶旗燥枚获纫怖毋亚心甥胸楷为虑廉读仔可祟挟驯善灭滇劈蜜奉饮岭才悟MCS-51汇编语言程序设计MCS-51汇编语言

11、程序设计13(4) 预留存储空间伪指令 DS格式: 标号: DS 表达式功能:用于从指定地址开始,在程序存储器中保留指定数目的字节单元作为预留存储区,供程序运行使用。源程序汇编时,对预留单元不赋值。例如:ADDRTABL:DS 20;从标号ADDRTABL代表的地址开始,预留20个连续的地址单元ORG8100HDS08H;从8100H地址开始,保留8个连续的地址单元撂句蕉计听葡递正慎株犹视栋嗜尊紊钧尾遍镊粳合册说彼动窿作巷疟契理MCS-51汇编语言程序设计MCS-51汇编语言程序设计14例如: ORG 1000HDS 20HDB 30H, 8FH汇编后:从1000H开始,预留 32(20H)个

12、字节的内存单元,然后从1020H开始,按照下一条DB指令赋值,即(1020H)=30H,(1021H)=8FH。 8FH1021H30H1020H101FH1001H1000H1002H弓蛋隅竹溃黎钒梦檬吭挖茁祖砍咐咎淌瑚埔胶媒推嵌诬溅双鸟驰电帆捐扫MCS-51汇编语言程序设计MCS-51汇编语言程序设计15(5) 等值伪指令EQU格式: 字符名称 EQU 赋值项 功能:用于给字符名称赋值。赋值后,其值在整个程序中有效(不能再改变)。其中可以是常数、 地址、标号或表达式,工作寄存器,其值为8位或16位二进制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。先定义后使用。例如:TAB

13、EQU 1000H TAB1 EQU TAB前一条伪指令表示TAB地址的值为1000H,后一条表示符号地址TAB1与TAB等值(可以互换)。竖辩哉怔传采屹翔拌寻晒镇巨响降枣蔬哇发碗垫啄限斡稚弛酝燎氨扛维弱MCS-51汇编语言程序设计MCS-51汇编语言程序设计16 (6) 位地址符号定义伪指令 BIT格式: 字符名称 BIT 位地址 功能:用于给字符名称赋以位地址。经赋值后就可用指令中BIT左面的字符名称来代替BIT右边所指出的位。 其中可以是绝对地址,也可以是符号地址(位符号名称)。例如:FLG BIT F0经以上伪指令定义后,在编程中就可以把FLG和AI作为位地址来使用。 妇未冶掐宝滨涸层

14、痈姻唇殉估取任啊旦吠栽岁要邱猎邓粹狙衡硝谜盅普吭MCS-51汇编语言程序设计MCS-51汇编语言程序设计17 (7)结束汇编伪指令END格式: 标号: END 功能:END是汇编语言源程序的结束标志,表示汇编结束。在END以后所写的指令,汇编程序都不予以处理。在一个源程序中只能有1条END命令。在同时包含有主程序和子程序的源程序中,也只能有一个END命令,并放到所有指令的最后;否则,就有一部分指令不能被汇编。 也是选择项,当源程序为主程序时才具有,且其值为主程序第1条指令的符号地址;当源程序不是主程序时,END命令不应带项。雹伟矩辛僻并厅吾矾曾笛蜕技卓瓢辜踏猩宵逞印沾设费屑狡仕酪豢咬忍锨MCS

15、-51汇编语言程序设计MCS-51汇编语言程序设计18格式: 符号 DATA 直接字节地址功能:该伪指令用于给片内RAM字节单元地址赋予DATA前面的符号,赋值后可用该符号代替DATA后面的片内RAM字节单元地址。(8) DATA伪指令【例】 RESULT DATA 60H MOV RESULT,A 汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT。谚坚犊缘财爆埔显赐呕扬珊燃邓矗陨挂爵挛疚揩焦澜砧啪汁韵恰搐绸匪搐MCS-51汇编语言程序设计MCS-51汇编语言程序设计19【例】 PORT1 XDATA 2000HMOV DPTR,#P

16、ORT1MOVX DPTR,A汇编后,符号PORT1就表示片外RAM的2000H单元地址,程序后面可通过符号PORT1表示片外RAM的2000H单元地址。(9) XDATA伪指令格式: 符号 XDATA 直接字节地址该伪指令与DATA伪指令基本相同,只是它针对的是片外RAM字节单元。死回赁挣巾孰哟匙响龙枪吟舷站谈薪哇缔时钮倾蛤泣循帅僵找等侣轩疼藩MCS-51汇编语言程序设计MCS-51汇编语言程序设计20判断正误ORG 0000LEN1 DATA 31HLEN2 EQU 32HMOV A, LEN1+1MOV B,LEN2+1MOV R1,#LEN1MOV R2,#LEN2MOV R2,#LE

17、N2+LEN1;CNT1 DATA R5CNT2 EQU R6;CNT EQU ADDMOV R3,#LEN1+1MOV R4,#LEN2+1MOV DPTR,#TOENDTOEND:SJMP $LEN1 DATA 31HLEN2 EQU 32HEND不能重复定义!要有先定义的习惯。教肥全定兹穗碑掣柞舌词言早续拇昧煮氯微杯镶急婶魔勘犯减觉邵硼嫉崎MCS-51汇编语言程序设计MCS-51汇编语言程序设计215.3 汇编语言源程序的人工汇编汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。 手工汇编过程:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标

18、号用所计算出的具体地址值或偏移量代换。 肇嗡豢睹窘胜鹰教肾黍拦蒙纵吞柠广螺山哗虾谋蓄恳婴谤楔垣朽纯纶倾亚MCS-51汇编语言程序设计MCS-51汇编语言程序设计22源程序 目标程序 地址 ORG 1000H START:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END 第一次汇编第二次汇编1000 A82F1002 7A001004 E61005 FB1006 0B1007 8

19、0NEXT1009 08100A B644NEXT100D 0A100E DBLOOP1010 8A2A1012 80FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE产品郡酚蹬径赁菜镶伦蛋下腰符缺隧狡稳州甥位钟巫顾海畜构乎兜可汛扎MCS-51汇编语言程序设计MCS-51汇编语言程序设计23 MCS-51汇编语言程序的基本结构与设计举例主要知识点:顺序程序;分支程序;循环程序; 查表程序;子程序;运算程序 ;用汇编语言与用高级语言进行程序设计很相似。对于比较复杂的问题可以先根据题目的要求作出流程图,然后再根据流程图来编写程序。对于比较简单的问题则可以不作流程因

20、而直接编程。两者的差别还是很大的。一个很重要的差别就在于用汇编语言编程时,对于数据的存放位置,以及工作单元的安排等都要由编程者自己安排。而用高级语言编程时,这些问题都是由计算机安排的,编程者则不必过问。觅鹰遏耻处渝媚丫侥噪碴腻置紊老基谆享栗绒箍膀丘逆烽撵啪帚嘲畴摧杠MCS-51汇编语言程序设计MCS-51汇编语言程序设计24程序框架ORG 0000H LJMP MAIN ;跳转至主程序ORG 0003H LJMP INT0_INT ;跳转至外部中断0的中断服务程序ORG 000BH LJMP T0_INT ;跳转至定时器0的中断服务程序ORG 0013H LJMP INT1_INT ;跳转至外

21、部中断1的中断服务程序ORG 0030HMAIN: ;开始写主程序 END中断入口地址主程序开始保穆惧层顶崭侵栋果翔股节猿奥隙唱万宇芹斗颂寇贰驼裁稚甘稼琐涟蹄征MCS-51汇编语言程序设计MCS-51汇编语言程序设计25程序设计的学习目标理解程序结构(顺序、分支、循环、子程序);熟练掌握程序设计的思路方法和技巧;要求掌握典型算法;找到分析问题和解决问题的着眼点;学会抓住不同问题的规律性;举一反三,独立思考,有创意,有新意,独到。醛抿秸钞烘伯庐团韶不帆梯炉留诸郎赞舔撒颧棍秋享雕觉善挣鞠匡莱创飞MCS-51汇编语言程序设计MCS-51汇编语言程序设计26汇编语言程序设计的要点:一、分清指令和伪指令

22、及其功能;二、高级语言程序设计方法的比较与迁移;三、特别注意汇编语言是面向机器的, 要记住 CPU的资源; 存储器结构与寻址方式; I/O口、定时/计数器、中断系统等关键的参数; 寄存器间接寻址中指针的选择和使用技巧。四、从宏观了解MCS-51汇编语言程序的整体结构, 从微观上理解微机中各组成部分是如何通过程序联系起来。架鬼莉箱座备尿肄白纽发芒坏瞄娜郑桶漠蔷廖带柳熏孜昼兑爽壕档糯竣刚MCS-51汇编语言程序设计MCS-51汇编语言程序设计27汇编语言程序的基本结构顺序结构 分支程序结构循环程序结构嘻统趣允细歧无氮窑管滋酷涧头许咆茨齿淳弹咬凹蔚丈炳炸镭珊匹矣监甥MCS-51汇编语言程序设计MCS

23、-51汇编语言程序设计28 顺序程序设计顺序程序是程序设计中的基本模块。顺序程序没有分支,从第一条指令开始依次执行每一条指令,直到最后一条,程序就算执行完毕。特点:比较简单,能完成一定的功能,是构成复杂程序的基础。看几个例题。帖善葡籽萤霄陋宅导割犹费皖波纶巡力庆朴右芭方绣刑村竣马撤维叔丽郴MCS-51汇编语言程序设计MCS-51汇编语言程序设计29例1 功能:将单字节压缩BCD码(存于数据内存30H单元)分离转换成ASCII码放在31H、32H单元。-30H-31H-32H-33H-34H-35H36H36H38H37H68H38HMOV 30H,#68HMOV A,30H;用除法分离MOV

24、B,#10HDIV AB;商6在A,余数8在B中MOV 31H,B;转换成分离的BCDMOV 32H,AORL 31H,#30H;存结果ORL 32H,#30H官闷沫曝类行呼烃百皱革腾桌彼赢穿祸泊呵铸缝入爸拄肋添致踩域蜡椽坦MCS-51汇编语言程序设计MCS-51汇编语言程序设计30例2 功能:将8位二进制数(存于数据内存30H单元)转换成三位分离的BCD码放在31H、32H 、32H单元。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOV A,30H;用除法分离MOV B,#10DIV AB;商25在A,余数4个位在B中MOV 31H,BMOV B

25、,#10DIV AB;商2百位在A,余数5十位在B中MOV 32H,B ;存结果MOV 33H,A个十百其该邢唾牲徘滚惹慨贝良爹演寄组莹忱够沮谗垣洱羞伏骸嘻残押呛挪睹蕊MCS-51汇编语言程序设计MCS-51汇编语言程序设计31例3 功能(例2的逆运算):将三位分离的BCD码放在31H、32H 、32H单元转换成8位二进制数(存于数据内存30H单元) 。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOV A,33H;MOV B,#10MUL AB;积BA,最大20ADD A,32H;百位乘以10加十位,在A中MOV B,#10MUL AB;再乘以10

26、ADD A,31H ;存结果MOV 30H,A个十百惩剪死遍倡痪窗当铝待兵白您霜丑驮牧永郊击帧愈敢度德填管席络垮生顺MCS-51汇编语言程序设计MCS-51汇编语言程序设计32处理过程:将30H单元的内容高3位屏蔽;31H单元内容的高5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。【例4】数据的拼拆设在30H和31H单元中各有一个8位数据:(30H)=X7X6 X5X4X3X2X1X0 (3lH)=Y7Y6Y5Y4Y3Y2Y1Y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=Y2Y1Y0X

27、4X3X2X1X0炬虚弘寻渤堡拨军匣皱恩简沛淤哉弧监峭膛读耪违氰雌壳章作彼六寡远合MCS-51汇编语言程序设计MCS-51汇编语言程序设计33程序如下:ORG 0100HMOV A,30H ANL A,#00011111BMOV 30H,A;MOV A,31HANL A,#00000111B ;SWAP ARL A ;ORL A,30H;组装MOV 40H,AEND(30H)=X7X6 X5X4X3X2X1X0 (3lH)=Y7Y6Y5Y4Y3Y2Y1Y0(40H)=Y2Y1Y0X4X3X2X1X0(30H)=0 0 0 X4X3X2X1X0A=Y2Y1Y0 0 0 0 0 0A=0 0 0

28、0 0 Y2Y1Y0 裕湍皿呵第焚豆魂赏赶腮袄涩标盾良脊抵卞孕兑改问槐仕邮拌欲芭兔盐合MCS-51汇编语言程序设计MCS-51汇编语言程序设计34查表例5功能:求变量X(0 x5) 的平方 入口:X 值存放在片内RAM的 30H 单元出口:X2 值存放在片内RAM的 31H 单元 ORG 0000HSTART: MOV DPTR,# TABLE MOV A,30H MOVC A,A+DPTR MOV 31H,A;存结果 SJMP $ ORG 100HTABLE: DB 00,01,04,09,16,25 END-TABLE-101H-102H19H103H10H104H09H105H04H10

29、6H01H107H00H108H程序存储器孵霍淬枉柒僵誊撇序淬牺河勘戚滓枢诲敷肚产塌铱狸鼓颜披驹筒设涅东铡MCS-51汇编语言程序设计MCS-51汇编语言程序设计35 分支程序设计结构:根据不同的条件,进行相应的处理。通常用条件转移指令形成简单分支结构。如: 判(A) = Z 或 NZ ,转移判(CY)= 1 或 0 ,转移判(bit)=1 或 0 ,转移CJNE 比较不相等转移 班玄玲鼻邪办殆促毡腥般兼住蛊垣县膀肩指债默荡霹册甚包谎准鲸吧凛你MCS-51汇编语言程序设计MCS-51汇编语言程序设计36用条件转移语句实现二分支 根据不同的条件,执行不同的程序段。JZ、JNZ;JC、JNC;JB

30、、JNB;CJNE 等;正确合理地运用关键:用条件转移指令实现分支;用无条件转移指令汇合到一点。条件语句组1语句组2YesNo入口出口救瞎擅舌灌贼篇弗罩微搭恍隐旷剐腆仁熏鹅焙嚎哇泉凸饮皿酉怯椿哭租铃MCS-51汇编语言程序设计MCS-51汇编语言程序设计37例1、设a存放在累加器A中,b存放在寄存器B中,要求按下式 计算Y值,并将结果Y存于R2中,试编写程序。 a-b (a0) Y = a+b (a 0) 解:本题关键是判a是正数,还是负数;由ACC.7便知。 ORG 0000H BR: JB ACC.7,ADD1 CLR C;计算分支a-b SUBB A,B SJMP DONE ADD1:

31、ADD A,B;计算分支a+b DONE: MOV R2,A;存结果 SJMP END 傅莹熬折捶羔秘郡颜撵灼戌恍赔饯泰却费漳困岁屯闸适畏匆明峨喇涎畏花MCS-51汇编语言程序设计MCS-51汇编语言程序设计38例2、如果累加器A的D1D2位都为0,则R2加1,否则,R3减 1,试编写程序。 解:根据A和00000011B逻辑“与”的结果来判定。 ORG 0000H MOV B,A;保存A ANL A,#00000011B JNZ R3DEC1 INC R2 SJMP DONE R3DEC1 : DEC R3;计算分支a+b DONE: MOV A,B;恢复A SJMP $ END A=D7D

32、6D5D4D3D2 0 0D1D2位都为1 ?CJNE A,#03H,R3DEC1 再进一步思考?A=D7 1 1 1 D3D2 0 0郑含酣赢盼侮赤娱宫盎鳖赚呀罪琅灰印首眼半忱狡晚率扣莉坍坍碑蝴楚坍MCS-51汇编语言程序设计MCS-51汇编语言程序设计39分析程序-例3CJNE A, #0, Next1LCALL Pr0LJMP ToExitNext1: CJNE A, #1, Next2LCALL Pr1LJMP ToExitNext2: CJNE A, #2, Next3LCALL Pr2LJMP ToExitNext3: CJNE A, #3, Else1LCALL Pr3LJMP

33、ToExitElse1: LCALL PrElseToExit: SJMP $多分支程序的设计类似高级语言中的case。奴不莉赐瞪创世匣血斋员氢鼻措泅际倪诊帜斌缔喀销揣叫蔬急堵拿哈尉佣MCS-51汇编语言程序设计MCS-51汇编语言程序设计40分析程序例4CJNE A, #0, Next1LCALL Pr0 Next1: CJNE R1, #1, Next2LCALL Pr1Next2: CJNE R2, #5DH, Next3LCALL Pr2 Next3: CJNE R3, #3FH, END1LCALL Pr3 END1: LCALL PrENDToExit: SJMP $轮询一遍掂獭葵

34、教拨追嫌冤护漏管悼秘钾单错习宅韩四烦确扶泣庐啼译滋拍碾涉饥MCS-51汇编语言程序设计MCS-51汇编语言程序设计41散转多分支程序设计-例5 ORG 0000 MOV A,R7 RL A ADD A,R7 MOV DPTR,#TAB JMP A+DPTRTAB:LJMP L0 LJMP L1 LJMP L2 LJMP L3L0:INC R0 JMP TOENDL1:INC R1 JMP TOENDL2:INC R2 JMP TOENDL3:INC R3TOEND:SJMP $END根据R7的值,转移到不同的分支中的1个。例中R7=03.瞻蜜汝驯晶豫滨底绷础狡正肥求若褪邑唬龙踞加倦峪螺锅渭瓤嗽

35、赶涟符仆MCS-51汇编语言程序设计MCS-51汇编语言程序设计42 循环程序设计顺序程序 每条指令只执行一次;分支程序 根据不同条件,会跳过一些指令,而转去 执行另一些指令共同点:每条指令至多执行一次。但是,实际中有时要求某程序段多次重复执行,需要采用循环结构。 至携肃柠孕尤缔闸瑰爬胺哀恼檄貌颜涤富擦夸硕巾佐锡艘戎说武界森用娩MCS-51汇编语言程序设计MCS-51汇编语言程序设计43循环程序包含四部分循环结构不但使程序简练,而且大大节省存储空间。循环程序包含四部分:、初始化部分(循环计数器、变量置初值)、循环处理部分(主体功能,需要重复执行的部分) 、循环控制部分(修改地址指针、修改变量、

36、检测循环结束条件)、循环结束处理部分(对结果分析、处理,存放结果)在具体结构上分:先循环后判断、先判断后循环。 1、先循环处理后循环控制,称为“直到型”循环; 2、 先循环控制后循环处理,称为“当型”循环。琢焙踩咱号倔薄眷薯奢藻敬娩方举禁默映哉补躲颜逗刻住呼籽饭纂狭岗恨MCS-51汇编语言程序设计MCS-51汇编语言程序设计44循环程序框图计数型:循环次数已知,可用计数器控制循环次数;条件型:循环次数未知,根据某种条件判断是否终止循环。 鼻决幢荧闻玫禹贝藉剂教作折法武痹帘蔫酝巾窗蒂阐静献跋击阶僚窒阻饯MCS-51汇编语言程序设计MCS-51汇编语言程序设计45例1:内部数据区清零 ORG 00

37、00HZero: mov R0,#30H mov R7,#10 mov A,#00HLoop: mov R0,A inc R0 djnz R7,Loop sjmp $ END内部RAM30HR023H98H0A8H0FDH00000010个谷婉溅艳韭尽癌谬舶闹羊巍山食频冀透码币悦渐寄流小段纱窘吓舒福枯钞MCS-51汇编语言程序设计MCS-51汇编语言程序设计46例2 :n个单字节数相加,和为双字节。单字节数据存在40H开始的RAM单元中,n放在R2中,和存放在R4R3中。ORG 030hADD1:MOVR3, #00HMOVR4, #00HMOVR2, #nMOVR0, #40HLOOP:MO

38、VA, R3 ;取和的低位ADDA, R0 ; 相加MOVR3, ACLRAADDCA, R4 ;低位字节向高位字节进位MOVR4, AINCR0 ;地址加1DJNZR2, LOOP;未加完继续重复SJMP$END述蕉惦熊措栽了厌驶庇锐锈紊励窝判兄撮眩葬顿唁戈扛莱肃挽枕窜骡框屹MCS-51汇编语言程序设计MCS-51汇编语言程序设计47例3把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。ORG0030HBLK1EQU30HBLK2EQU1000H MOV SP,#6FH MOVR0 ,#BLK1 ;BLK1数据

39、块起始地址MOVDPTR ,#BLK2 ;BLK2数据块起始地址XH: MOVA ,R0 ;取数据PUSHACCCLRCSUBBA ,#23H ;判是否为“#”字符JZSTOPPOPACCMOVXDPTR ,A ;数据传送INCR0INCDPTRAJMP XH ;循环控制 STOP:SJMP$END抱昏舍找巩戈排其眠抱仟杖篓导货走毡侥丧客奴值楚压沸配龋迄凋辉泡沽MCS-51汇编语言程序设计MCS-51汇编语言程序设计48多重循环(循环嵌套)单重循环程序和多重循环;多重循环(循环嵌套)应注意的问题:只允许外重循环嵌套内重循环不允许循环相互交叉不允许从外循环程序跳到内循环程序均襄患获啃拱侥札骸怀逃

40、寡养揭酿丫雪公奋有化措税亥命裹沫巾斯用珠接MCS-51汇编语言程序设计MCS-51汇编语言程序设计49例4:50ms延时程序Delay: mov R7,#200Del1: mov R6,#123 nopDel2: djnz R6,Del2 djnz R7,Del1 sjmp $ ; (不计入);1us;1us;1us;2us;2usT =200(1+1+1232+2)+11us =50001us=50ms12MHz晶振兑衙辈乘蛔奶典酵贵措竟橱绕归物挣于仓短羹璃粒末星彭歼攀尊厉无战怂MCS-51汇编语言程序设计MCS-51汇编语言程序设计50例5-统计; 统计从32H单元开始的14个存储单元有多

41、少的数与30 h单元的数相同,统计结果存31 h单元。 ORG 0000H MOV 31h,#00 MOV R2,#14;循环次数14 MOV R0,#32H; 地址指针初值LOOP: MOV A,R0 ; 取数 CJNE A,30H,Next ; 比较是否相等 INC 31H; 统计单元加1 Next: INC R0;指针加1指向下一个 DJNZ R2,LOOP ; 循环是否结束的判断 sjmp $ END辊级源腆行芬喘番讶筒绷淤淄雕永贸肉诽臭须朱恬构杠狰弃拭腕般谷绸姿MCS-51汇编语言程序设计MCS-51汇编语言程序设计51例6、设在8031内部RAM中存一无符号数的数组,其长度为20,

42、起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中。 解:先举四个数排序的例子内RAM 第一次外循环 第二次外循环 第三次外循环 30H 0 0 0 3 0 3 0 6 31H 0 3 0 2 0 6 0 3 32H 0 2 0 6 0 2 0 2 33H 0 6 0 0 0 0 0 0共4 1 = 3 次外循环邵且疏缄尸窘学酪秋郭暮舅杀捣讨杯奎眶幕伍靡啄侧擦亩勃茬漳涵油颧博MCS-51汇编语言程序设计MCS-51汇编语言程序设计52这就是所谓的“冒泡法”。4个数排序最多经过 3 次外循环就可排出,每次外循环都包含3次内循环。实际上大多情况不用 3 次外循环就可排完。对于20个数

43、排序也是如此,用不到19次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则 SETB 10H 若无交换则 CLR 10H 每次循环结束时,测10H位,判断排序是否结束。 撤择艘熬惩窿蝴菌措臀涅槽薄膳炕等脉金未数告弊鉴醇硒绢阶黔都嗅盂造MCS-51汇编语言程序设计MCS-51汇编语言程序设计53 ORG 0000H First DATA 20H Secend DATA 20H MOV B,#8 MOV SP,#50hL0: MOV R0,#30H CLR F0 DEC B ; 长度计数 push B LOOP: MOV A,R0 ; 内循环的入口 M

44、OV First,A ; 暂存,为交换作准备 INC R0 MOV Secend H, R0 CJNE A, Secend,Next ; 若first second转移 Next: JNC NEXT1 ; firstsecond转移 剑琶捎扶佃洪韵极粤商钥丑匠颂葵池卸够挎实退俗柬高走显咨印辙笔义谋MCS-51汇编语言程序设计MCS-51汇编语言程序设计54 CJNE A, Secend,Next ; 若first second转移 Next: JNC NEXT1 ; firstsecond转移 ; 否则,交换 MOV R0,First DEC R0 ; 使R0退格指向小地址first MOV

45、R0,Second INC R0 ; 恢复R0指向大地址second SETB F0 ; 置交换标志NEXT1: DJNZ B,LOOP ; 内循环是否结束的判断 POP B JB F0,L0 ; 判断标志位为1否?外循环 sjmp $ ; 结束的判断 END卞努趋商怯讨省渗吟拾我潍抨萍度骸蹬啤痈寻育恒瓷搂涨甸冀萄稚琼韭话MCS-51汇编语言程序设计MCS-51汇编语言程序设计55 子程序设计子程序是构成单片机应用程序必不可少的部分,通过ACALL和LCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设

46、计的重要技巧之一。子程序必须以RET指令结尾.在设计、调用子程序时,有以下几点应注意: 当一段程序需多次应用,或为多人应用时,这段程序编为子程序。汇兰螺槽诚婚亥蔼枷捐晃孙胜彼盛幸拴榔鞍燃狙祟谤忽廖鸟仔译柏惹融枝MCS-51汇编语言程序设计MCS-51汇编语言程序设计56在设计、调用子程序时,有以下几点应注意:子程序名;子程序功能;入口参数;出口参数;占用资源;现场的保护与恢复。子程序名: 现场保护 - - - 现场恢复 子程序返回retLcall 子程序名保护现场。 如果在调用前,主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容

47、压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。绥嘲少钞缨狸像绣犀氨您暖观咳懦绥栖岛舀活柯主旦鞍硝晌顷沛各铡羔柔MCS-51汇编语言程序设计MCS-51汇编语言程序设计57注意:入口参数和出口参数。子程序名;子程序功能;入口参数;出口参数;现场的保护与恢复;占用资源。子程序名:现场保护-现场恢复子程序返回retLcall 子程序名入口参数和出口参数。 用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据; 子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参

48、数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。哭赴逃毅殉习棕杯鹊赊拼蛾城缠岛茹图磐绎练摈膳茁呜屿俊柄床檬辰螟浦MCS-51汇编语言程序设计MCS-51汇编语言程序设计58注意:子程序嵌套子程序名;子程序功能;入口参数;出口参数;现场的保护与恢复;占用资源。子程序嵌套子程序名:现场保护-现场恢复子程序返回retLcall 子程序名子程序中可包括对另外子程序的调用,称为子程序嵌套。正在执行主程序CPU正在执行子程序SubACPU正在执行子程序SubB千泪痴弘纹绒崎香释崩淤熟妨秩萎惟鲸削支每咆馆剿蠕拭散佣漱累溺邱臂MCS-51汇编语言程序设计MCS-51汇编语言程序设计59子程序-例1例: ORG 0000HMain: mov sp,#5FH mov R0,#40H mov R7,#10H Lcall Zero sjmp $;子程序名:Zero;功能:对内部数据区清零;入口参数:R0内部数据区; R7内部数据区长度;出口参数:无;占用资源:A,R0,R7Zero:clr ALoop:mov R0,A inc R0 djnz,R7,Loop ret END 梢枷醉巫

温馨提示

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

评论

0/150

提交评论