ARM Cortex中TBB指令分支逻辑及DCB使用相关疑问
ARM Cortex TBB 指令分支逻辑答疑
问题1:你的上述理解是否正确?
你的理解有部分正确,也存在关键错误:
- 正确点:R1是8位无符号计数器(取值范围0-255),对应分支索引;当R1=0时分支到P0的逻辑符合预期。
- 错误点:
- PC寻址逻辑错误:Thumb模式下执行
TBB指令时,PC的值指向当前指令之后的第二条指令(即TBB指令地址+4)。如果BrTable1紧接在TBB之后(如你的代码),BrTable1的地址是TBB指令地址+2,此时PC比BrTable1高2字节,直接用[PC,R1]会访问到BrTable1+2+R1的位置,和你预期的BrTable1+R1不符——你需要用[PC,#-2,R1]来修正基址偏移,或者将BrTable1的地址存入寄存器作为基址。 - 分支公式错误:正确的目标地址计算公式是
PC_new = BrTable起始地址 + 2 * 偏移字节值,其中偏移字节值是从基址+R1指向的内存单元中取出的8位数据。你的公式多了一次BrTable指针的累加,不符合ARM架构定义。
- PC寻址逻辑错误:Thumb模式下执行
问题2:仅处理R10和R110时,有无紧凑写法?
不需要在BrTable1 + 10位置编写DCB指令,有两种紧凑写法:
写法1:先条件判断再用TBB
先过滤非目标的R1值,只对0和10的情况分支,避免填充无用的表项:
CMP R1, #10 BEQ P10 ; 直接跳转到R1=10对应的分支 CMP R1, #0 BNE Default ; 处理非0非10的默认情况 TBB [PC,#-2] ; PC偏移-2后指向BrTable1 BrTable1 DCB ((P0 - BrTable1)/2) ; 仅定义R1=0的偏移
写法2:修改R1索引后用TBB
将R1的值映射为紧凑的索引(0和1),再用TBB访问小型分支表:
CMP R1, #10 MOVEQ R1, #1 ; 将R1=10映射为索引1 CMP R1, #0 BNE Default ; 处理其他值 TBB [PC,#-2] BrTable1 DCB ((P0 - BrTable1)/2) ; 索引0对应P0 DCB ((P10 - BrTable1)/2) ; 索引1对应P10
问题3:能否对寄存器R1进行控制?
完全可以控制R1的值,常见方式包括:
- 直接赋值:
MOV R1, #0、MOV R1, #5 - 从其他寄存器计算:
ADD R1, R2, #3、SUB R1, R3, R4 - 从内存读取:
LDRB R1, [R0](读取字节到R1) - 条件修改:
CMP R1, #10; MOVEQ R1, #1(如问题2中的写法,根据比较结果修改R1) - 注意:TBB只会使用R1的低8位作为索引,所以确保R1的值在0-255范围内即可。
内容的提问来源于stack exchange,提问作者Lalit Arora
相关产品推荐
相关产品推荐

