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