- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2.3.4 散转程序设计
在设计单片机应用程序时,经常遇到根据不同的输入或运算结果决定程序流向的问题。这就是散转程序,实际就是一种多分支程序。散转程序也需要一个表,但表中所列的不是普通数据,而是某些功能程序的入口地址、偏移量或转向这些功能程序的转移指令。程序的散转功能,主要依靠间接转移指令JMP @A+DPTR完成。
下面有3个例题,不好验证,因为程序不全。但是在光盘中有为了验证而添加了几个功能程序段的程序,可以在WAVE环境下仿真验证,它们是:散转_指令表.ASM;散转_地址表.ASM;散转_RET.ASM。
(1)利用转移指令表进行散转
假设有一个标志单元,它的可能取值为0,1,2… …的自然数,每个值对应一个处理程序。我们可以利用转移指令表,使程序根据标志单元的值转向各自的处理程序。选择与处理程序相同数目的无条件转移指令,由这些指令组成一张指令表,且第1条转移指令转向“0”标志所对应的处理程序、第2条转移指令转向“1”标志所对应的处理程序,依次类推。然后把指令表的起始地址和标志单元的值分别送数据指针DPTR和累加器A中,最后使用散转指令完成。
【例2-36】 根据标志单元R2中的内容,分别转向各个处理程序。
分析:
程序采用AJMP指令组成指令表,因为AJMP为双字节指令,所以在散转前需要对标志单元内容进行乘2调整。当乘积超过255时,在数据指针DPTR的高8位加上进位“1”处理。
源程序:
ORG 1000H
PJ1: MOV DPTR,#TAB1 ;表首地址送DPTR
MOV A,R2
ADD A,R2 ; (R2)*2的值送累加器A
JNC NADD
INC DPH ;当(R2)*2的值大于255时,DPH加1
NADD: JMP @A+DPTR
TAB1: AJMP PRG0
AJMP PRG1
… …
AJMP PRGn
伟福仿真验证程序:散转_指令表.ASM,看到R2的值是几就会转移到第几个功能程序就行了。
(2)利用转向地址表进行散转
当转向范围比较大时,可直接使用转向地址表法,即把每个处理程序的入口地址直接放到地址表内。用查表指令从表中查找与变量值对应的处理程序的入口地址,再通过间接转移指令,使程序转向该地址指向的功能程序。
【例2-37】 根据标志单元R2中的内容,分别转向各个处理程序,这些处理程序零星分布在程序存储器中。
分析:
当多个功能程序被分散分布时,如通过标志数据执行这些程序,最好使用转向地址表法。首先把各服务程序的入口地址,按标志数据的升序对应排开,构成一个地址表。然后根据R2中的数据,从表中查找相应服务程序的入口地址。由于入口地址为16位,因此需要对R2寄存器进行乘2调整。而且把入口地址读入DPTR需分两次进行。
注意:利用间接转移指令进行散转时,累加器A应先清零。
源程序:
ORG 1000H
MOV DPTR,#TAB ;表首地址送DPTR
MOV A,R2
ADD A,R2 ;(R2)*2的值送累加器A
JNC MYJW
INC DPH ;当(R2)*2的值大于255时,DPH加1
MYJW: MOV R4,A
MOVC A,@A+DPTR ;取地址的高8位
XCH A,R4 ;地址高8位暂存在R4
INC A
MOVC A,@A+DPTR ;取地址的低8位
MOV DPL,A
MOV DPH,R4
CLR A ;偏移量清零
JMP @A+DPTR
TAB: DW PRG0
DW PRG1
… …
DW PRGn
这种多分支程序要验证有点麻烦,需要把各个功能程序都列出来才行。伟福仿真验证程序:散转_地址表.ASM,看到R2的值是几就会转移到第几个功能程序就行了。
(3)利用“RET”指令进行散转
此方法与转向地址表法基本相同。两者的惟一区别是,转向地址表法,将表中取出的功能程序的入口地址直接送给数据指针;而返回指令法,则把入口地址压入堆栈进行保存,并随后执行一条RET指令,使程序转向功能程序。
【例2-38】根据标志单元R2R3中的内容,分别转向各个处理程序。
分析:
先建立一个各服务程序的入口地址表。由于入口地址为16位,因此需要对R2R3内容进行
您可能关注的文档
最近下载
- 金海通分选机操作手册Pick And Place Manual20.pdf
- 电力工程项目管理面临难题及应对策略探讨.doc VIP
- 2025年一年级数学加减法口算题每日一练(25套打印版) .pdf VIP
- 20以内加减法口算题每日练 (打印版).docx VIP
- 2026年高考时事政治高频考点(91条).doc
- 2011年一级建筑师场地作图真题及详细解答.pdf VIP
- 应用电化学:锌空气电池.ppt VIP
- 冀教版(2024)新教材八年级数学上册第十四章14.3.3 实数的大小比较 课件.pptx VIP
- (英语)高考英语过去完成时真题汇编(含答案) .pdf VIP
- 小学足球脚内侧踢球教案.doc VIP
原创力文档


文档评论(0)