channlv

channlv

小组等级:     E币:510  (E币换礼)

#1楼主:散转 是什么意思啊!

文章发表于:2008-05-04 18:11

指点一下啊!

wangyi1e

   小组等级:     E币:375  (E币换礼)

#2

文章发表于:2008-05-04 21:09

是不是可以理解为把DB里面的数据换做了跳转指令啊

程序匠人

   小组等级:     E币:3086  (E币换礼)

#3

文章发表于:2008-05-04 20:35

转贴连接:http://www.dzquan.com/space/html/42/n-4042.html

第七章 MCS51程序设计(单片机应用教程之课次十五,电子圈原创)

发布: 2008-4-19 06:50 | 作者: feller | 来源: 本站原创 | 查看: 90次

        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)参考程序

      MOV  DPTR,#TAB      ;转移表首地址

      MOV  A,R2           ;输入分支序号

      ADD  A,R2           ;乘2与转移指令双字节相对应

      JNC  NADD           ;(R2)×2≤255跳到NADD

      INC  DPH            ;(R2)×2 >255处理地址表高8位

NADD: JMP  @A+DPTR        ;散转至地址表

TAB:  AJMP PRG0

      AJMP PRG1

      …

      AJMP PRG255

        3)程序说明

        这个程序由于使用了AJMP指令,因此所有的处理程序入口PRG0、PRG1、…、PRG255和散转表TAB都必须在同一2KB范围内。如果一个2KB内放不下所有处理程序,可以把一些较长的处理程序放在其他地方,而在2KB内用LJMP指令转向这些处理程序。如上例PRG1放于2KB内的某地址处,而其实际的处理程序入口为WPRG1,可用如下指令实现:

        PRG1: LJMP WPRG1

        这个散转程序使用的AJMP指令为2字节指令,所以存于R2的分支序号需要乘以2才能保证正确地实现散转。若使用3字节的LJMP指令,存于R2的分支序号需要乘以3。如果(R2)乘以3大于255,则需要修改DPTR的高8位,程序如下:

        MOV  DPTR,#TAB

        MOV  A,R2

        MOV  B,#3

        MUL  AB

        XCH  A,B          ;(R2)×3的高8位存在A中

        ADD  A,DPH        ;(R2)×3的高8位加到DPH上

        MOV  DPH,A

        XCH  A,B          ;(R2)×3的低8位在A中

        JMP  @A+DPTR

TAB:  LJMP PRG0

        LJMP PRG1

        …

        LJMP PRG255

        (2)地址偏移表法(在256B范围内转移)

        如果转向的程序均在同一页(256B),可以使用地址偏移表来实现转移。

        例:案R2的内容转向4个处理程序。

        1)题目分析

        (R2)=0、1、2、3,分别转向PRG0、PRG1、PRG2、PRG3。

        该方法利用指令JMP @A+DPTR与伪指令DB汇编时的计算功能实现散转,例如当(R2)=0时,执行MOVC A,@A+DPTR后,A中为PRG0~TAB,执行JMP @A+DPTR时,(A)+(DPTR)=PRG0-TAB+TAB=PRG0,故转向PRG0.

        使用这种方法,转移表的大小加上各个程序长度必须小于256B,转移表和各处处理程序可以位于程序存储器的任何地方。

        2)参考程序

        MOV  A,R2

        MOV  DPTR,#TAB     ;转移地址表表首

        MOVC A+@A+DPTR

        JMP  @A+DPTR

TAB:  DB   PRG0-TAB      ;转移程序与转移地址首表的偏移量

        …

        DB   PRG3-TAB

PRG0: 处理程序0

        …

PRG3: 处理程序3

        (3)转向地址表法(64KB范围内转移)

        当转向范围较大时,可以直接使用转向地址表的方法,它的各项表格为各个转向程序的入口。散转时,使用查表指令,按某个单元的内容查表,找到对应的转向地址,把它装入DPTR中。然后将累加器A清0,再利用JMP @A+DPTR指令直接转向相应的处理程序。

        例:根据(R2)转向各个处理程序

        参考程序:

        MOV  DPTR,#TAB

        MOV  A,R2

        ADD  A,R2          ;A←(R2)×2

        JNC  NADD

        INC  DPH

NADD: MOV  R3,A          ;暂存

        MOVC A,@A+DPTR

        XCH  A,R3          ;转移地址高8位

        INC  A

        MOVC A,@A+DPTR

        MOV  DPL,A         ;转移地址低8位

        MOV  DPH,R3

        CLR  A

        JMP  @A+DPTR

TAB:  DW   PRG0

        DW   PRG1

        …

        DW   PRGn

        用这种方法可以实现64KB范围内的转移,但散转数n≤255。如果n>255则应采用双字节加法运算来修改DPTR。

        例:根据n(n>256)转向相应的处理子程序,n放在(R2、R3)中,各子程序入口地址放于双字节表格中。

        参考程序:

        MOV  DPTR,#TAB

        CLR  C

        MOV  A,R3

        RLC  A

        MOV  R3,A

        XCH  A,R2

        RLC  A

        XCH  A,R2

        ADD  A,DPL

        MOV  DPL,A

        MOV  A,DPH

        ADDC A,R2

        MOV  DPH,A

        CLR  A

        MOVC A,@A+DPTR

        MOV  R2,A

        CLR  A

        INC  DPTR

        CLR  A

        MOVC A,@A+DPTR

        MOV  DPL,A

        MOV  DPH,R2

        CLR  A

        JMP  @A+DPTR

TAB:  DW   PRG0

        DW   PRG1

        …

        DW   PRGn

        (4)通过堆栈操作实现多分支程序转移

        分支入口程序地址放在表TAB中,表TAB为16位地址。根据分支程序序号,使用查表指令,实现多分支程序的转移。

        例:根据(R2)转向n个处理程序(n≤255)

        参考程序:

        MOV  SP,#60H       ;设堆栈指针

        MOV  DPTR,#TAB     ;分支程序入口地址表首地址

        MOV  A,R3

        RL   A             ;分支序号×2

        MOV  R1,A          ;暂存A

        INC  A             ;先查地址低8位

        MOVC A,@A+DPTR     ;取地址低8位

        PUSH ACC           ;地址低9位压桟

        MOV  A,R1          ;恢复A

       MOVC A,@A+DPTR     ;取地址高8位

       PUSH ACC           ;地址高8位压桟

       RET                ;利用RET指令把PRGn弹给PC

TAB:  DW   PRG0

       …

       DW   PRGn

cyber211

   小组等级:     E币:969  (E币换礼)

#4

文章发表于:2008-05-04 19:52

我也不董,有高人指点一下,他跟跳转,switch  case语句有什么区别?

jizzll

   小组等级:     E币:3401  (E币换礼)

#5

文章发表于:2008-05-04 19:50

不懂

Total , Page /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

赞助商链接

所有小组精华文章

EDN网页 所有网页