什么是散转.doc

上传人:b****2 文档编号:1258357 上传时间:2022-10-19 格式:DOC 页数:7 大小:37.50KB
下载 相关 举报
什么是散转.doc_第1页
第1页 / 共7页
什么是散转.doc_第2页
第2页 / 共7页
什么是散转.doc_第3页
第3页 / 共7页
什么是散转.doc_第4页
第4页 / 共7页
什么是散转.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

什么是散转.doc

《什么是散转.doc》由会员分享,可在线阅读,更多相关《什么是散转.doc(7页珍藏版)》请在冰豆网上搜索。

什么是散转.doc

第七章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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1