对本次反汇编中 shl 指令的使用感到困惑

逆向工程 拆卸 x86 C 数据库
2021-06-21 08:23:47

我在 C 中创建了一个代码结构来查看它在 x86 中的外观。我对 shl 指令的使用感到困惑。我对 <+39> 和 <+51> 行之间发生的事情感到困惑我不明白这些指令如何转换为源代码。

代码构造

这是源代码: 来源

这显然是编译器优化,但我不明白这如何等于乘以 21。 [它是位移 eax、0x2 或乘以 4 两次,但我不明白加法指令如何使它从乘以16 至 21]

谢谢你的帮助!罗海尔。

1个回答

让我们一行一行地分解它。假设x是您想要乘以的东西21并将其存储在eax(如本例中第 行之后34)。

<39>: mov edx, eax  ; so copy the x to edx
<41>: mov eax, edx  ; it's pointless to do this mov; after those two lines eax & edx has the value of x
<43>: shl eax, 2    ; so eax = x * 4
<46>: add eax, edx  ; so eax = x * 5  (x * 4 + x)
<48>: shl eax, 2    ; so eax = x * 20 (x * 5 * 4)
<51>: add eax, edx  ; so eax = x * 21 (x * 5 * 4 + x)

附注。对于未来,请将代码作为文本发布。复制比从图像容易得多。