如何解释程序集中的*
操作?它是否涉及某种数组操作?
IDA的示例片段,涉及程序参数的使用:
mov eax, [ebp+arg_0]
mov ecx, [ebp+arg_4]
mov edx, [ecx+eax*4-4]
这是一个乘法运算。
在x86中,您可以在一条指令中使用以下表达式访问内存。
*(base + offset*multiplier + displacement)
在基极和偏移是寄存器的情况下,乘法器是1、2、4或8,位移是常数。
通常,当你看到这一点时,你会看到一个数组操作,例如ecx - 4
(它只是arg_4 - 4
,其中arg_4
是一个指针)可能是一个4字节整数数组的开始,而eax
(它只是arg_1
,其中arg_1
是一个size_t
)可能是数组的偏移量。然而,它绝对可以是任何东西。当使用优化编译程序时,编译器将使用这些构造来实现各种巧妙的技巧。