我在一个基本块中有以下 2 条 ARM 指令,它是我试图转换为 C 的函数的一部分。
ADDS r4, r2, r7
ADC r5, r3, r7, ASR#31
根据我的理解,第一条指令执行 ar4 = r2+r7并设置标志。下一条指令执行r5 = r3 + (r7>>31) + <carryflag>。指令在 C 中看起来如何?
我在一个基本块中有以下 2 条 ARM 指令,它是我试图转换为 C 的函数的一部分。
ADDS r4, r2, r7
ADC r5, r3, r7, ASR#31
根据我的理解,第一条指令执行 ar4 = r2+r7并设置标志。下一条指令执行r5 = r3 + (r7>>31) + <carryflag>。指令在 C 中看起来如何?
没有直接匹配汇编代码的单个 C 指令。发生的事情是 r7 中的 32 位值与 r2/r3 中的 64 位值相加,结果写入 r4/r5。
您可以在几种不同的情况下验证这一点:
r7。这意味着ADC无需添加任何内容,只需复制r3到r5.r7无论如何都是正的。该ADC加一(从进位标志),以占溢出。r7为负(第 31 位为 1)。该ASR指令产生一个-1(所有位设置),因为它进行算术移位,而不是逻辑移位。这有效地从r3第二条指令中减去 1 。所以原来的 C 代码大概是这样的:
__int64__ r23;
__int32__ r7;
__int64__ r45;
r45=r23+r7;
正如我所说,asm 代码与 C 代码并不真正匹配,因为 C 没有任何类型扩展语法。(您可以在 C 中使用强制转换,但这并不能真正使任何事情变得更清楚)。
这就是为什么逆向工程不仅仅是从汇编中创建 C 的原因之一;您必须了解汇编、寄存器、处理器特性和编译器快捷方式,才能了解这些情况下发生的情况。