首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CM3 中一些前卫的指令(4)

CM3 中一些前卫的指令(4)

如果 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时执行
继承事业,薪火相传
返回列表