我正在编写一个工具来将ARM Thumb指令反汇编到ARM Thumb程序集中,可以使用库存汇编程序(plug)将其重组为原始二进制文件。 “股票装配商”部分似乎是一个棘手的问题。一条特别的指示给我带来了麻烦。
示例:
编码的拇指指令0x1f12
使用subs r2, r2, #4
和Capstone反汇编为arm-none-eabi-objdump -D
。根据严格正确的this document(参见5.2格式2),立即值在第三个操作数字段内打包。
然而,当我用subs r2, r2, #4
组装指令arm-none-eabi-as
时,使用.syntax unified
指令(这允许指令上的一些标志在Thumb中没有任何意义,例如{在s
的末尾{1}},我得到subs
。这在功能上等同于上面的编码(参见5.3格式3),但它是不同的。
出于我的目的,这使事情变得非常复杂(例如0x3a04
位于subs
表中,该表被简单地解析为指令,并且以不同方式重新编码,这将是调试的噩梦)
问题:
当立即值在范围内时,有没有办法强制tbb
使用格式2?实际上,如果我将arm-none-eabi-as
个操作数中的任何一个更改为另一个寄存器,则指令将根据需要以格式2进行编码,这是唯一可行的方法。当源寄存器和目标寄存器相同时,无论立即值的大小如何,它都以格式3对其进行编码。
也欢迎替代方案,但我认为我的其他选择是定制(或编写)汇编程序,或者只是不拆解违规指令。
注意:
删除r2
不会更改编码,只允许汇编.syntax unified
而不是subs
。