assembly - x86 ASM 使用 * 运算符处理 eax

标签 assembly operators ida

如何解释汇编中的*操作?它是否涉及某种数组操作?

来自 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) 将是数组中的偏移量。然而,它绝对可以是任何东西。当程序通过优化进行编译时,编译器将使用这些构造来发挥各种巧妙的技巧。

关于assembly - x86 ASM 使用 * 运算符处理 eax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216497/

相关文章:

c - 为什么gcc生成 "leal -8240(%ebp), %eax; cmpl $1, %eax; ja XXX"而不是jmp指令?

c - 堆栈上的数组内存分配

c++ - RE - IDA 查找函数偏移量

c - 汇编到伪代码的理解

从 x86 汇编器调用 C 函数

python - 如何从 Python 列表中提取列?

javascript - 何时在 JavaScript 中使用双非 (!!) 运算符

c - 数字左移-1的值是多少

c++ - MFC .dll,CString问题,IDA c++伪代码,有多接近?

c - 如何在 MASM 格式的汇编文件中强制使用 GNU 汇编指令,反之亦然