- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机汇编语言程序设计(mhr)研讨
4. 7 子程序 子程序是构成单片机应用程序必不可少的部分,由于MCS-51单片机由ACALL和LCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。善于灵活地使用子程序,也是程序设计的重要技巧之一。 在调用子程序时,有以下几点应予以注意: 1) 保护现场。如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元和寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主子程序使用不同的寄存器组。 3 2) 设置入口参数和出口参数。调用之前主程序要按子程序的要求设置好入口参数,子程序从指定的地址单元或寄存器获得输入数据,经运算或处理的结果存放到指定的地址单元或寄存器,只有这样主程序才能在调用后,在出口参数处得到调用后的结果。这就是子程序和主程序间的数据传递。 3) 子程序中可包括对另外子程序的调用,称之为子程序嵌套。 3 例4-19 用程序实现c=a2+b2,设a, b均小于10。a存放在31H单元,b存放在32H单元,把c存入33H单元(和为BCD码)。 解 因本题二次用到平方值,所以在程序中采用把求平方编为子程序的方法。依题意编写主程序和子程序如下 主程序: ORG 0000H MOV SP, #3FH ;设堆栈指针 MOV A, 31H ;取a值 LCALL SQR ;求a2 MOV R1, A ; a2暂存R1 MOV A, 32H ;取b值 LCALL SQR ;求b2 ADD A, R1 ;求a2 +b2 DA A ;BCD码调整 MOV 33H, A ;存入33H SJMP $ 3 子程序: ORG 400H 400 SQR: INC A 401 MOVC A, @A+PC 402 RET TAB: DB 0, 1, 4, 9,16, DB 25, 36,49 40B DB 64, 81 END 主程序和子程序之间的参数传递均使用累加器A,子程序中INC A指令是因为MOVC A,@A+PC 执行时,当前PC指向RET指令,RET指令为一字节,即当前PC和表头相隔1字节,所以变址调整值为1。 3 例4-20 求两个无符号数据块中的最大值。数据块的首地址分别为60H和70H,每个数据块的第一个字节都存放数据块长度。结果存入5FH单元。 分析 本例可采用分别求出两个数据块的最大值,求最大值的过程可采用子程序。子程序的入口参数是数据块首地址,存放在R1中,返回参数即为最大值,存放在A中。下面分别列出主程序 和子程序。 主程序: 3 ORG 0030H MOV R1,#60H ;置入口条件参数 ACALL QMAX ; 调求最大值子程序 MOV 40H, A ; 第一个数据块的最大值暂存40 MOV R1, #70H ;置入口条件参数 ACALL QMAX ;调求最大值子程序 CJNE A,40H,NEXT NEXT JNC LP MOV A,40H LP MOV 5F,A SJMP $ 子程序: ORG 0100H QMAX: MOV A, @R1 ;取数据块长度 MOV R2, A ;设置计数值 CLR A ;设0为最大值 LP1: INC R1 ;修改地址指针 CLR C ;0—C SUBB A, @R1
文档评论(0)