ARM中的ADC:对应的C是什么?

逆向工程 手臂 反编译
2021-07-10 17:42:26

我在一个基本块中有以下 2 条 ARM 指令,它是我试图转换为 C 的函数的一部分。

ADDS r4, r2, r7
ADC  r5, r3, r7, ASR#31

根据我的理解,第一条指令执行 ar4 = r2+r7并设置标志。下一条指令执行r5 = r3 + (r7>>31) + <carryflag>指令在 C 中看起来如何?

1个回答

没有直接匹配汇编代码的单个 C 指令。发生的事情是 r7 中的 32 位值与 r2/r3 中的 64 位值相加,结果写入 r4/r5。

您可以在几种不同的情况下验证这一点:

  • 第一条指令中没有溢出, 中的正数(第 31 位为零)r7这意味着ADC无需添加任何内容,只需复制r3r5.
  • 第一条指令产生溢出,但r7无论如何都是正的。ADC加一(从进位标志),以占溢出。
  • r7为负(第 31 位为 1)。ASR指令产生一个-1(所有位设置),因为它进行算术移位,而不是逻辑移位。这有效地从r3第二条指令中减去 1

所以原来的 C 代码大概是这样的:

__int64__ r23;
__int32__ r7;
__int64__ r45;
r45=r23+r7;

正如我所说,asm 代码与 C 代码并不真正匹配,因为 C 没有任何类型扩展语法。(您可以在 C 中使用强制转换,但这并不能真正使任何事情变得更清楚)。

这就是为什么逆向工程不仅仅是从汇编中创建 C 的原因之一;您必须了解汇编、寄存器、处理器特性和编译器快捷方式,才能了解这些情况下发生的情况。