在IDA Pro中,我看到下面列出的ARM ASM。 IDA使用什么位来获得7200?
A3 F5 E1 53 SUB.W R3,R3#7200
为方便起见,值为二进制如下
7200 = 0x1c20 = 0001 1100 0010 0000
0xA3F5E153 = 1010 0011 1111 0101 1110 0001 0101 0011
编辑:在IDA选择中加载文件。 Mach-O文件(DYLIB)ARMv7 [macho.lhc]
答案 0 :(得分:2)
ARM ARM(ARM架构参考手册)是一个很好的资源,特别适用于ARM和拇指指令编码。对于thumb2,虽然寻找ARMv7-M TRM(技术参考手册),但都是免费下载。
(我知道我用0x7200十六进制开始,而不是小数点为7200,这就好了,最后都可以解决)。
子r3,r3,#0x7200编码如下(对于ARM)。
E意味着始终执行
2的高三位表示数据处理立即没有其他固定位 4的2位和3位的低位是0010,这意味着sub。 4位的低位是s位意味着更新标志(如果设置了该位,则为子指令)。接下来的两个半字节3和3是接下来4位的r3的两个实例,c是旋转字段,低8位是立即数。
移位器操作数是immed_8 rotate_right(rotate_immed * 2)所以就是这样 0x72向右旋转(24位),这与向左旋转32-24位相同,因此会立即生成0x7200。
对于thumb2(sub.w来自的地方编码如下:
f5a3 43e4 sub.w r3,r3,#29184; 0x7200
T3编码
0xF1A00000有或没有一些位是SUB.W rd,rd,#const的基线编码(立即12位,T4也有12位)。
0x5中的0x4位是i位并且被置位所以我们需要知道,s位没有设置,它是sub而不是sub。 0x .... 4中的低三位... nibble是imm3字段,低8位是使用arm表示法的imm8字段我们的立即是1:100:11100100
取这些位的前五位,i,imm3和上位imm8位11001
这意味着取位模式11100100并将其右移1001位
00000000011100100 ...
<00> 0000 0000 0111 0010 0 ......,常数是
0x00720000它关闭256,必须弄明白
嗯,我在做0x7200你正在做十进制7200,你提到的是0x1C20
所以看看你的工具告诉你工具告诉你什么
A3 F5 E1 53
我们知道我们需要一个0xF5A3,所以也许其他部分也可以交换。
0xF5A353E1
你得到的是:
f5a3 53e1 sub.w r3,r3,#7200; 0x1c20
相同的t3编码
0xF5A3表示sub.w某事,r3,i位设置 0x53E1表示sub.w r3,r3,某些东西和const是 1:101:11100001
高5位11011 这意味着将11100001右移0b1011位,即11
0000000000011100001000
<00> 0000 0000 0001 1100 0010 0000 0000 00000x001C2000
如果你的年龄足以认识Seinfeld,那么这就属于yada,yada类别 armv7-m TRM的A5.3.2(拇指指令中修改的立即常数)。
<010> 01010他们显示有两位填充(在这五位mnopq中抛出第二位n离开mopq作为移位量或在这种情况下为0b0010)。他们有......其他东西,yada yada,然后
11111成为移位/填充23位 11110是垫22 11101是垫21,但它们之间的区域不是线性的,那里有一些魔力 如果我们继续努力 11100是垫20, 11011是垫19,
这就是我们在1和7下immed8位之前寻找19的垫。
0x00001C20
所以thumb2 12位常量编码有点痛苦,你可以优化很多有趣的常量。设置imm3的高位的这个特定的位置留下4位或16个模式/值。但我们可能想要填充最多24位,我们无法到达那里。显然,如果i位为零,则从顶部向下填充,如果设置了i位,则从中间点开始填充它。
请查看armv7 trm中的SUB指令。将t3编码为你想要做的事情。描述说拇指移位值是i:imm3:imm8,取这些位 到a.5的相同手册并查看表a5-1的T3编码称它为const而不是imm12,imm12编码看起来是在a5-1表之后的伪代码中。
另请注意,您没有使用正在查看thumb2指令的ARM指令。是的,是ARM系列的一部分,但是不同的指令集或模式。