TBB TBH


TBB,TBH
高级语言都提供了“分类讨论”式控制结构,如C语言的switch,Basic语言的Select Case。通常,给我们的印象是比较靠后的case执行起来效率比较低,因为要一个一个地查。有了TBB/TBH后,则改善了这类结构的执行效率(可以对比51中的MOVC)
TBB(查表跳转字节范围的偏移量)指令和TBH(查表跳转半字范围的偏移量)指令,分别用于从一个字节数组表中查找转移地址,和从半字数组表中查找转移地址。TBH的转移范围已经足以应付任何臭长的switch结构。如果写出的switch连TBH都搞不定,只能说那人有严重自虐倾向。
因为CM3的指令至少是按半字对齐的,表中的数值都是在左移一位后才作为前向跳转的偏移量的。又因为PC的值为当前地址+4,故TBB的跳转范围可达255*2+4=514;TBH的跳转范围更可高达65535*2+4=128KB+2。请注意:Both TBB和TBH都只能作前向跳转,也就是说偏移量是一个无符号TBB的语法格式为:
TBB.W [Rn, Rm] ; PC+= Rn[Rm]*2
在这里,Rn指向跳转表的基址,Rm则给出表中元素的下标。图4.5指示了这个操作
图4.5 TBB功能演示
如果Rn是R15,则由于指令流水线的影响,Rn的值将是PC+4。通常很少有人会手工计算表中偏移量,因为很繁,而且程序修改后要重新计算,尤其是当跨源文件查表时(由连接器负责分配地址)。所以这种指令在汇编中很少用到,通常是C编译器专用的,它可以在每次编译时重建该表。不过,可以为各入口地址取个标号,而且此指令还有其它的使用方式。在系统程序的开发中,此指令可以提高程序的运行效率。为了提供一个节能高效的操作系统或者基础函数库,必须挖空心思地使用各种奇异的技巧,甚至在极端情况下,还要严重违反常规程序设计的基本原则。
另外还要注意的是,不同的汇编器可能会要求不同的语法格式。在ARM汇编器(armasm.exe)中,TBB跳转表的创建方式如下所示:
TBB.W [pc, r0] ; 执行此指令时,PC的值正好等于branchtable
branchtable
DCB ((dest0 – branchtable)/2) ; 注意:因为数值是8位的,故使用DCB指示字
DCB ((dest1 – branchtable)/2)
DCB ((dest2 – branchtable)/2)
DCB ((dest3 – branchtable)/2)
dest0
... ; r0 = 0时执行
dest1
... ; r0 = 1时执行
dest2
... ; r0 = 2时执行
dest3
... ; r0 = 3时执行
TBH的操作原理与TBB相同,只不过跳转表中的每个元素都是16位的。故而下标为Rm的元素要从Rn+2*Rm处去找。如图4.6所演示:
Cortex-M3 权威指南 第 4 章
81
图4.6 TBH功能演示
TBH跳转表的创建方式与TBB的类似,如下所示:
TBH.W [pc, r0, LSL #1] ; 执行此指令时,PC的值正好等于branchtable
branchtable
DCI ((dest0 – branchtable)/2) ; 注意:数值是16位的,故使用DCI指示字
DCI ((dest1 – branchtable)/2)
DCI ((dest2 – branchtable)/2)
DCI ((dest3 – branchtable)/2)
dest0
... ; r0 = 0时执行
dest1
... ; r0 = 1时执行
dest2
... ; r0 = 2时执行
dest3
... ; r0 = 3时执行

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值