- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter05汇编语言程序的设计
5.3 分支程序 例:设内部RAM的5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。 解: ;重新把X装入A A, 5AH MOV ;将平方的低字节暂存于R1 R1, A MOV ;X的平方存于BA AB MUL ;将值暂存于B B, A MOV ;将5AH单元的值传送到累加器A A, 5AH MOV ;程序放在0100H开始的单元 0100H ORG 5.3 分支程序 ;程序结束 END ;原地踏步 $ SJMP ;将结果传送到5BH单元 5BH, R0 MOV RESULT: ;将结果斩存到R0 R0, A MOV ; X<10,Y = X2–1 A, #01H SUBB ;借位标志清零,准备做减法 C CLR ;将平方的低字节放回A A, R1 MOV LITTLE: ;跳转到RESULT RESULT SJMP ;将结果暂存于R0 R0, A MOV ;10≥X≥5,Y = X2 + 8 A, #08H ADD ;X≤10,则将X的平方放回A A, R1 MOV ;X 10,转RESULT RESULT JNC MIDDLE: ;X不等于11,则跳转到MIDDLE A, #11, MIDDLE CJNE ;X≥5。先假设X 10,41暂存于R0 R0, #41 MOV ;X5则转LITTLE LITTLE JC GREAT: ;X不等于5,则跳转到GREAT A, #5, GREAT CJNE 5.3 分支程序 例:设有n个分支程序,n小于256,将n存放在R4中,设计散转程序。(采用散转指令) 解:程序清单如下。 散转程序——采用散转指令 OPRn AJMP …… ;其它分支程序 OPR1 AJMP ;转移到分支程序OPR0 OPR0 AJMP TAB1: ;转向形成的散转地址入口 @A+DPTR JMP NOAD: ;有进位,则加到高字节地址 DPH INC ;判断是否有进位 NOAD JNC ;(R4)×2→A(修正变址值),双字节指令 A, R4 ADD ;R4的值放入A A, R4 MOV ;跳转表首地址送数据指针 DPTR, #TAB1 MOV 5.3 分支程序 例:设转移入口地址为OPR0、OPR1、…、OPRn,根据R2的内容转入各对应的分支程序中去。 解:散转程序及转移表如下: 散转程序——采用转向地址表 ;(R2)×2的进位加至DPH DPH INC ;判断是否有进位 NADD JNC ; (R2)×2→A,后面的地址为双字节 A, R2 ADD ;将R2的值传送到A A, R2 MOV ;将表格首地址送DPTR DPTR, #TAB1 MOV 5.3 分支程序 散转程序——采用转向地址表 OPRn DW ;其它转移地址 OPR1 DW ;16位转移地址表的首地址 OPR0 DW TAB1 ;转向分支程序 @A+DPTR JMP ;A清零 A CLR ;置转移地址高8位 DPH, R3 MOV ;置转移地址低8位 DPL, A MOV ;取地址低8位 A, @A+DPTR MOVC ;2倍R2的值加1 A INC ;转移地址高8位暂存到R3 A, R3 XCH ;取地址高8位 A, @A+DPTR MOVC ;暂存2倍R2的值 R3, A MOV NADD: 5.4 循环程序 循环程序:一些有规可循而又反复处理的问题。 利用CJNE(比较转移指令)、 DJNZ(减1不为“0”转移指令)等实现。 例:在内部RAM 30H~4FH 连续32个单元中存放了单字节无符号数,求32个无符号数之和,并存入内部RAM 51H、50H中。 解: 这是重复相加问题,要设置一些工作单元。 设: R0 作加数地址指针, R7 作循环次数计数器, R3 作和数的高字节寄存器。 流程图: #31→R7 #0→R3 (30H)→A #31H→R0 CY=0? END START (R7)-1=0? 51H←(R3) 50H← (A) Y N (A)+((R0))→A (R0+1)→R0 (R3)+1→R3 N Y N Y (A)+((R0))→A (R3)+1→R3 R0 -加数地址指针 R7 -循环次数计数器 R3 -和数的高字节寄存器 程序: ;R7作循环次数计数器 ;R3作和数高字节寄存器 ;取被加数 ;R0作加数地址指针 ;CY=0,和256,则转 ;作加法 ;CY=1,加到高字节 ;修改R0指针 ;未完,继续加 ;存和数 初始化部分 循环体部分 结束部分
文档评论(0)