繁体   English   中英

ARM Assembly TBB指令-跳跃如何工作?

[英]ARM Assembly TBB Instruction - how does jumping work?

因此,我试图了解TBB如何在Assembly中用于switch语句。 我在教科书/在线手册中看到了它的写法,但是我不明白偏移量在分支表中是如何工作的。 它如何从分支表到指令? 如何减去标签以获得正确的偏移量,为什么要除以2?

在我的教科书中说

程序应跳转到的指令的内存地址计算如下:
目标= PC + 4 +(2 * BranchTable [r0])

其中r0是包含分支表内偏移量的计数器。 在TBB上,PC已指向下一条指令(分支表,PC = PC + 4)。 分支表应该向适当的指令(2 * BranchTable [r0])加载第二个偏移量。 从我在教科书和网上看到的内容中,分支表标签从指令标签中减去。 这应该提供约4n的偏移量。 为什么要除以2? 谢谢!

编辑:做了一些数学

所以我做了一些数学运算,结果发现分支表中的偏移量是[(label2-label1)/ 2]。 较早地插入方程式中,可以得出target = PC + 4 +(标签2-标签)。 这是有道理的,但我仍然想知道是否有人有原因,或者我的逻辑是否错误-为什么将TBB设置为除以2 /乘以2?

TBB / TBH仅在Thumb2模式下可用。

ARM Thumb2指令始终从偶数地址开始。 能够分支到PC+4 + {0, 2, 4, 6, 8, ..., 508, 510}
PC+4 + {0, 1, 2, 3, 4, ..., 254, 255 } ,因为所有奇数偏移量都是无用的。 正如@Jester在第一条评论中所解释的那样 ,乘以2 将使您从一个字节的偏移量到范围的两倍,而不会损失灵活性。

ARM的设计人员本可以将其设计为始终乘以4,但是512B通常是足够的范围,并且有时需要填充代码块为4字节长的倍数。 如果需要更大的偏移量,则TBH使用半字16位偏移量(仍乘以2)。

这是一个使用TBB的跳转表的真实示例,原始的十六进制和注释的反汇编计算出如何达到每个分支目标的数学方法(例如
case 3: (0x3164 + 0x9 * 2) ): 在ARM拆卸的一部分中被TBB混淆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM