马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
程序员在程序设计中,有时为使程序成一定的功能,需要调用一系列子程序中的一个,而决定究竟调用哪一个,则由程序的计算值确定。当然,可伶来完成这件事,例如: 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] ;否则跳转到表中 但是要注意,每次使用跳转表都要承受有条件地跳过转移的代价,所以还是上面的程序更有效一些。 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网
|