- UID
- 1029342
- 性别
- 男
|
如果 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 所演示:
图 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时执行 |
|