《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > ARM汇编程序跳转表

ARM汇编程序跳转表

2017-06-22
关键词: 汇编语言

程序员在程序设计中,有时为使程序成一定的功能,需要调用一系列子程序中的一个,而决定究竟调用哪一个,则由程序的计算值确定。当然,可伶来完成这件事,例如:

                     BL          JUMPTAB

                     …

JUMPTAB      CMP       R0,#0

                     BEQ       SUB0

                     CMP       R0,#1

                     BEQ       SUB1

                     CMP       R0,#2

                     BEQ       SUB2

然而当子程序列表很长时,这种解决方案变得非常慢,这是一般不希望的。为了解决这个问题,程序员提出了跳转表的有效解决方案。跳转表是利用程序计数器PC在通用寄存器文件中的可见性实现。例如:

                     BL          JUMPTAB

                     …

JUMPTAB      ADR       R1,SUBTAB       ;R1<-SUBTAB

                     CMP       R0,#SUBMAX    ;检查超限

                     LDRLS   PC,[R1,R0,LSL #2]       ;如果OK,则跳转到表中

                     B            ERROR                 ;否则,发出错误信息

SUNTAB        DCD       SUB0                    ;子程序表入口

                     DCD       SUB1

                     DCD       SUB2     

DCD指示汇编器保留一个存储子,将它初始化为右边表达式的值,这在伪操作中已介绍,在这种情况下存储字中保留的只是标号的地址。

不管表中有多少子程序,以及它们使用的频度如何互不相关,这种方法的性能不变。但要注意,读跳转表时不能超出了表的末端,检查越限是必需的。越限检查时通过有条件地向PC置数实现的,所以越限时读取指令被跳过,并转移到错误处理。越限检查惟一的性能代价是执行同最大值进行比较的指令。更直接的代码可以是:

       CMP       R0,#SUBMAX                  ;检查越限

       BHI        ERROR                               ;如果越限,则调出出错处理

       LDR       PC,[R1,R0,LSL  #2]       ;否则跳转到表中

但是要注意,每次使用跳转表都要承受有条件地跳过转移的代价,所以还是上面的程序更有效一些。


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。