Assembly 试图了解x86寻址是如何工作的

Assembly 试图了解x86寻址是如何工作的,assembly,x86,Assembly,X86,我试图了解这两行中发生了什么: mov %esp,%edi lea 0x10(%edi),%esi 首先,我将当前堆栈指针保存到%edi寄存器。这是清楚的。但是现在。。。我从之前的过程跳回到堆栈区域,并将地址保存在%esi寄存器中?我为什么要这样做?现在,我不知道这个地址包含什么。有人能帮我解释一下这条线的含义吗?您不需要mov%esp,%edi,您可以通过以下方式获得相同的结果: lea 0x10(%esp),%esi x86中的堆栈会随着您将内容推入堆栈而变小,%esp 获取按4的倍

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

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

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

您不需要mov%esp,%edi,您可以通过以下方式获得相同的结果:

 lea  0x10(%esp),%esi
x86中的堆栈会随着您将内容推入堆栈而变小,%esp 获取按4的倍数递减的较小值,该值与 x86上的双字[32位]

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

通常在lea之后,存在使用结果地址的操作 在lea生成的地址处或附近读取或写入值。这些行动是什么 你做什么取决于节目的其他部分,你没有给我们看,所以
无法猜测。

您不需要mov%esp,%edi,您可以通过以下方式获得相同的结果:

 lea  0x10(%esp),%esi
x86中的堆栈会随着您将内容推入堆栈而变小,%esp 获取按4的倍数递减的较小值,该值与 x86上的双字[32位]

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

通常在lea之后,存在使用结果地址的操作 在lea生成的地址处或附近读取或写入值。这些行动是什么 你做什么取决于节目的其他部分,你没有给我们看,所以
无法猜测。

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


通过谷歌搜索x86和/或x86_64 ABI标准,查找有关允许在堆栈上传递的参数与在寄存器中传递的参数、堆栈帧的布局方式、局部变量所在位置的更多信息,以及许多其他有助于理解编译器生成的汇编代码的内容。

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


通过谷歌搜索x86和/或x86_64 ABI标准,可以找到更多关于允许在堆栈和寄存器中传递哪些参数的信息,堆栈框架的布局方式,局部变量的位置,以及许多其他有助于理解编译器生成的汇编代码的信息。

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