我正在编写/(使用 binutils)一段代码来手动反汇编 thumb2(16 位和 32 位)指令。我在区分真正的 ARM 指令和 DATA 部分时遇到了问题。
最大的问题是指令不是字对齐的。所以当我尝试阅读 32 位指令时,很多时候它实际上与下一条指令重叠。
请提供任何帮助。
谢谢,VJ
如果您还能够读取符号表,GCC 将留下符号 $a $t $d 指示您应该在哪个地址切换您解释字节的方式:分别是 Arm、Thumb 和 Data。
例如,这就是 objdump 如何知道显示文字池的内容,但不尝试将它们映射回指令,尽管 a .text 部分中的相邻函数之间存在。
arm 指令总是字对齐的。拇指总是对齐的。thumb2 是可变字长。并且您不能以与固定字长相同的方式拆卸可变字长。要反汇编可变字长指令集,您不能简单地遍历对齐地址上的内存并反汇编。在某种形式下,您必须按执行顺序遍历数据以找到每条指令的起始地址,然后从该列表中反汇编。