【发布时间】:2020-12-02 20:58:08
【问题描述】:
编译器对地址运算符的翻译是否与指针不同?
我想知道,因为反编译器有时会显示:
func_test(&a, &b[0x32*ebx])
本质上应该是一样的
func_test((_DWORD *)a,(_DWORD *)(b+0x32*ebx))
正确吗?我对算术 tbh 有点困惑。 以这种方式显示有什么特殊含义还是只是为了更容易阅读?
【问题讨论】:
-
涉及
b的表达式看起来等价,第一个更简单,更像LEA语法。但是涉及a的表达式不是;您现在将值转换为指针,而不是获取地址。这更像是一个 C 问题而不是 asm。 -
请注意,
&b[50 * ebx]不是您可以在一条 LEA 指令中执行的操作;比例因子只能左移 0..3 位,不能任意相乘。虽然单个 LEA 可以乘以 5 与lea eax, [ebx + ebx*4] -
@Peter Cordes 由于 4 个字节而受到限制,86_64 限制为 8 个字节吗?我也不清楚这两种方式是否以完全相同的方式转换为汇编方式,以及反编译器是否出于视觉原因选择了这种显示方式
标签: c assembly x86 reverse-engineering decompiling