什么是散转.doc
- 文档编号:1258357
- 上传时间:2022-10-19
- 格式:DOC
- 页数:7
- 大小:37.50KB
什么是散转.doc
《什么是散转.doc》由会员分享,可在线阅读,更多相关《什么是散转.doc(7页珍藏版)》请在冰豆网上搜索。
第七章MCS51程序设计(单片机应用教程之课次十五,电子圈原创)
注意的知识点:
MOVC为查表指令, 用来查找以列表形式或系统地排列在存储器中的数据的一种指令。
以下两条查表指令均采用基址寄存器加变址寄存器间接寻址方式,第一条指令PC存放的是下一条将要执行指令的地址,八PC作为基址寄存器,第二条DPTR作为基址寄存器,A为累加器A。
所实现的是把A+PC或A+DPTR地址所指存储器里的内容传送给累加器A。
程序寄存器只能读不能写,因此其数据的传输是单向的,即从程序存储器中读出数据到累加器A中。
MOVCA,@A+PC
MOVCA,@A+DPTR
DPTR(DataPointer)
数据指针DPTR是80C51中一个功能比较特殊的寄存器。
从结构DPTR是一个16位的特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,DPTR既可以作为一个16位的寄存器来处理,也可以作为两个独立的8位寄存器来使用。
主要功能是存放16位地址,作为片外RAM寻址用的地址寄存器(间接寻址),故称数据指针。
访问片外数据存储器的指令为:
MOVXA,@DPTR读
MOVX@DPTR,A写
DPTR的另一个作用是变址寻址,访问程序存储器,做查表指令:
如:
以dptr为基址寄存器,将dptr的内容与累加器a的内容相加得到变址地址
movca,@a+dptr;(a)<-----((a)+(dptr))
7.4.2散转程序
散转程序是分支程序的一种,使用指令JMP@A+DPTR,可实现多分支转移。
它是根据某种输入或运算的结果,分别转向各个处理程序段取执行程序。
下面以根据R2的内容转向各处理程序为例介绍几种散转程序的设计方法。
(1)转移指令表法(在2KB范围内转移)
把转移指令AJMP(或LJMP)顺序写入转移表。
根据累加器A中的分支序号,通过JMP指令转向表中的某一条JMP指令,然后再执行AJMP指令,把程序转移到指定的分支入口。
这种分支方法实际上是通过两次转移实现的。
例:
根据R2的内容,转向各个处理程序。
1)题目分析
(R2)=0,转向PRG0
(R2)=1,转向PRG1
……
(R2)=255,转向PRG255
2)参考程序
MOVDPTR,#TAB;转移表首地址
MOVA,R2;输入分支序号
ADDA,R2;乘2与转移指令双字节相对应
JNCNADD;(R2)×2≤255跳到NADD
INCDPH;(R2)×2>255处理地址表高8位
NADD:
JMP@A+DPTR;散转至地址表
TAB:
AJMPPRG0
AJMPPRG1
…
AJMPPRG255
3)程序说明
这个程序由于使用了AJMP指令,因此所有的处理程序入口PRG0、PRG1、…、PRG255和散转表TAB都必须在同一2KB范围内。
如果一个2KB内放不下所有处理程序,可以把一些较长的处理程序放在其他地方,而在2KB内用LJMP指令转向这些处理程序。
如上例PRG1放于2KB内的某地址处,而其实际的处理程序入口为WPRG1,可用如下指令实现:
PRG1:
LJMPWPRG1
这个散转程序使用的AJMP指令为2字节指令,所以存于R2的分支序号需要乘以2才能保证正确地实现散转。
若使用3字节的LJMP指令,存于R2的分支序号需要乘以3。
如果(R2)乘以3大于255,则需要修改DPTR的高8位,程序如下:
MOVDPTR,#TAB
MOVA,R2
MOVB,#3
MULAB
XCHA,B;(R2)×3的高8位存在A中
ADDA,DPH;(R2)×3的高8位加到DPH上
MOVDPH,A
XCHA,B;(R2)×3的低8位在A中
JMP@A+DPTR
TAB:
LJMPPRG0
LJMPPRG1
…
LJMPPRG255
(2)地址偏移表法(在256B范围内转移)
如果转向的程序均在同一页(256B),可以使用地址偏移表来实现转移。
例:
案R2的内容转向4个处理程序。
1)题目分析
(R2)=0、1、2、3,分别转向PRG0、PRG1、PRG2、PRG3。
该方法利用指令JMP@A+DPTR与伪指令DB汇编时的计算功能实现散转,例如当(R2)=0时,执行MOVCA,@A+DPTR后,A中为PRG0~TAB,执行JMP@A+DPTR时,(A)+(DPTR)=PRG0-TAB+TAB=PRG0,故转向PRG0.
使用这种方法,转移表的大小加上各个程序长度必须小于256B,转移表和各处处理程序可以位于程序存储器的任何地方。
2)参考程序
MOVA,R2
MOVDPTR,#TAB;转移地址表表首
MOVCA+@A+DPTR
JMP@A+DPTR
TAB:
DBPRG0-TAB;转移程序与转移地址首表的偏移量
…
DBPRG3-TAB
PRG0:
处理程序0
…
PRG3:
处理程序3
(3)转向地址表法(64KB范围内转移)
当转向范围较大时,可以直接使用转向地址表的方法,它的各项表格为各个转向程序的入口。
散转时,使用查表指令,按某个单元的内容查表,找到对应的转向地址,把它装入DPTR中。
然后将累加器A清0,再利用JMP@A+DPTR指令直接转向相应的处理程序。
例:
根据(R2)转向各个处理程序
参考程序:
MOVDPTR,#TAB
MOVA,R2
ADDA,R2;A←(R2)×2
JNCNADD
INCDPH
NADD:
MOVR3,A;暂存
MOVCA,@A+DPTR
XCHA,R3;转移地址高8位
INCA
MOVCA,@A+DPTR
MOVDPL,A;转移地址低8位
MOVDPH,R3
CLRA
JMP@A+DPTR
TAB:
DWPRG0
DWPRG1
…
DWPRGn
用这种方法可以实现64KB范围内的转移,但散转数n≤255。
如果n>255则应采用双字节加法运算来修改DPTR。
例:
根据n(n>256)转向相应的处理子程序,n放在(R2、R3)中,各子程序入口地址放于双字节表格中。
参考程序:
MOVDPTR,#TAB
CLRC
MOVA,R3
RLCA
MOVR3,A
XCHA,R2
RLCA
XCHA,R2
ADDA,DPL
MOVDPL,A
MOVA,DPH
ADDCA,R2
MOVDPH,A
CLRA
MOVCA,@A+DPTR
MOVR2,A
CLRA
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVDPL,A
MOVDPH,R2
CLRA
JMP@A+DPTR
TAB:
DWPRG0
DWPRG1
…
DWPRGn
(4)通过堆栈操作实现多分支程序转移
分支入口程序地址放在表TAB中,表TAB为16位地址。
根据分支程序序号,使用查表指令,实现多分支程序的转移。
例:
根据(R2)转向n个处理程序(n≤255)
参考程序:
MOVSP,#60H;设堆栈指针
MOVDPTR,#TAB;分支程序入口地址表首地址
MOVA,R3
RLA;分支序号×2
MOVR1,A;暂存A
INCA;先查地址低8位
MOVCA,@A+DPTR;取地址低8位
PUSHACC;地址低9位压桟
MOVA,R1;恢复A
MOVCA,@A+DPTR;取地址高8位
PUSHACC;地址高8位压桟
RET;利用RET指令把PRGn弹给PC
TAB:
DWPRG0
…
DWPRGn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 什么是