【问题标题】:Is there a difference between the address operator and a pointer in assembly?地址运算符和汇编中的指针之间有区别吗?
【发布时间】: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


【解决方案1】:

&a 返回a 的地址,而(_DWORD *)a 强制编译器将a 的内容重新解释为指向_DWORD 的指针。所以这两种表达方式是根本不同的。

如果a_DWORD 的数组(声明为_DWORD a[A_LENGTH];),它可能是等价的。在这种情况下,&aa 本质上与 a 相同,在指针上下文中降级为简单指针,尽管 _DWORD * 转换是多余的。

b 的表达式是等价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多