【问题标题】:trying to understand how x86 addressing works试图了解 x86 寻址的工作原理
【发布时间】:2013-06-11 19:07:03
【问题描述】:

我试图了解这 2 行中发生了什么:

mov %esp,%edi
lea 0x10(%edi),%esi

首先,我将当前堆栈指针保存到 %edi 寄存器。这很清楚。但是现在......我从之前的过程中跳回了 16 字节的堆栈区域并将地址保存在 %esi 寄存器中?我为什么要那么做?此时,我不知道这个地址包含什么。有人可以帮我解释一下这条线的含义吗?

【问题讨论】:

  • 如果你不知道为什么要这样做,你为什么要写它?
  • 不是我写的。我只是想理解代码。
  • 好吧,我很困惑,因为你一直说“我做这个”和“我做那个”,暗示你写的。所以我猜另一个问题是,“为什么没有注释代码,所以它解释了他们在堆栈上寻找什么?”我们不知道堆栈上有什么。希望原作者能做到。

标签: assembly x86


【解决方案1】:

你不需要 mov %esp,%edi,你可以得到相同的结果:

 lea  0x10(%esp),%esi

x86 中的堆栈“向下”增长,因为您将内容推入堆栈,%esp 获得更小的值(以 4 的倍数递减,与 x86 上的“双字”[32 位])。

所以 lea 正在做的是计算堆栈中被推送的位置 通过一些较早的计算。因为 0x10 == 4* 0x4,所以它正在寻找 堆栈中的第 4 个双字。

通常在 lea 之后,有些操作会使用结果地址 在 lea 生成的地址处或附近读取或写入值。这些操作是什么 正在做取决于程序的其余部分,您没有向我们展示,所以有 没办法猜测。

【讨论】:

    【解决方案2】:

    根据这些指令在函数中的位置,可能是 a) 加载传递给堆栈上函数的参数的值,或 b) 加载函数中定义的局部变量的值,或 c) 完全不同的东西,如果没有更多上下文就无法猜测。

    Google x86 和/或 x86_64 ABI 标准可找到更多信息,了解哪些参数可以在堆栈中传递,哪些参数可以在寄存器中传递、堆栈帧的布局方式、局部变量的位置以及许多其他信息帮助理解编译器生成的汇编代码。

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多