我试图了解这 2 行中发生了什么:
mov %esp,%edi
lea 0x10(%edi),%esi
首先,我将当前堆栈指针保存到 %edi 寄存器。这很清楚。但是现在......我从之前的过程中跳回了 16 字节的堆栈区域并将地址保存在 %esi 寄存器中?我为什么要那么做?此时,我不知道这个地址包含什么。有人可以帮我解释一下这条线的含义吗?
您不需要 mov %esp,%edi,您可以通过以下方式获得相同的结果:
lea 0x10(%esp),%esi
x86 中的堆栈“向下”增长,当您将内容推入堆栈时, %esp 获得较小的值(以 4 的倍数递减,与 x86 上的“双字”[32 位] 的大小匹配)。
所以 lea 正在做的是计算堆栈中由一些早期计算推送的位置。因为 0x10 == 4* 0x4,它在堆栈中查找第 4 个双字的位置。
通常在 lea 之后,有一些操作使用结果地址在 lea 生成的地址处或附近读取或写入值。这些操作在做什么取决于程序的其余部分,您没有向我们展示,因此无法猜测。
根据这些指令在函数中的位置,可能是 a) 加载传递给堆栈上函数的参数的值,或 b) 加载函数中定义的局部变量的值,或 c)完全不同的东西,如果没有更多的上下文就无法猜测。
谷歌 x86 和/或 x86_64 ABI 标准,以查找有关允许在堆栈和寄存器中传递哪些参数、堆栈帧的布局方式、局部变量的位置以及许多其他有助于理解编译器的信息的更多信息- 生成的汇编代码。