C 参数如何加载到$esp中?

C 参数如何加载到$esp中?,c,assembly,C,Assembly,假设我有两个参数arg1和arg2,以及一个我希望调用的函数。如果我将arg1加载到$esp+4中,将arg2加载到$esp中,我将执行以下哪项操作: 函数arg1、arg2 或 函数arg2,arg1 我正在使用IA32。farg2,arg1 堆栈向下扩展,参数的布局有点像一个数组,尤其是您的示例调用arg2的第一个参数位于同一位置,而不管调用中有多少个参数 否则,当函数采用数量可变的参数时,将很难使函数工作 从理论上讲,一个平台可以做不同的事情,但在任何主要的例子中都不是这样。farg2,a

假设我有两个参数arg1和arg2,以及一个我希望调用的函数。如果我将arg1加载到$esp+4中,将arg2加载到$esp中,我将执行以下哪项操作:

函数arg1、arg2

函数arg2,arg1

我正在使用IA32。

farg2,arg1 堆栈向下扩展,参数的布局有点像一个数组,尤其是您的示例调用arg2的第一个参数位于同一位置,而不管调用中有多少个参数

否则,当函数采用数量可变的参数时,将很难使函数工作

从理论上讲,一个平台可以做不同的事情,但在任何主要的例子中都不是这样。

farg2,arg1 堆栈向下扩展,参数的布局有点像一个数组,尤其是您的示例调用arg2的第一个参数位于同一位置,而不管调用中有多少个参数

否则,当函数采用数量可变的参数时,将很难使函数工作


从理论上讲,一个平台可以做得不同,但任何主要实例都不是这样。

是一篇非常有用的文章,它非常好地解释了应用程序堆栈。

是一篇非常有用的文章,它非常好地解释了应用程序堆栈。

哦,天哪,我可以用我最喜欢的方式回答

这要看情况了

这取决于您使用的呼叫机制。看一看,你会感到惊讶

但是,请注意,在最常见的默认设置cdecl中,函数参数按从右到左的顺序推送到堆栈上。事实上,它们也在Windows使用的stdcall中从右向左推送

现在来计算esp+x在函数排序中的方向。堆栈从地址空间的高端向下增长,从右到左排序意味着最右边的对象首先进入堆栈,因此最右边的参数具有更高的内存地址。因此,当您将内存地址参数添加到esp或任何跟踪堆栈中最低内存地址参数的寄存器时,您正在从右向左移动参数


我想补充一点,ebp倾向于作为基本指针,esp被移动,以允许按照的描述进行局部变量存储。

哦,天哪,我用我最喜欢的方式回答

这要看情况了

这取决于您使用的呼叫机制。看一看,你会感到惊讶

但是,请注意,在最常见的默认设置cdecl中,函数参数按从右到左的顺序推送到堆栈上。事实上,它们也在Windows使用的stdcall中从右向左推送

现在来计算esp+x在函数排序中的方向。堆栈从地址空间的高端向下增长,从右到左排序意味着最右边的对象首先进入堆栈,因此最右边的参数具有更高的内存地址。因此,当您将内存地址参数添加到esp或任何跟踪堆栈中最低内存地址参数的寄存器时,您正在从右向左移动参数


我想补充一点,ebp倾向于作为基本指针,esp被移动,以允许按照的描述进行局部变量存储。

是所有对逆向工程感兴趣但没有相关经验的人的必读读物。

是所有对逆向工程感兴趣但没有相关经验的人的必读读物主题。

这取决于func的体系结构和调用约定。如果要获得正确答案,必须指定此信息。这取决于func的体系结构和调用约定。如果你想得到正确的答案,你必须指定这些信息。我还推荐他关于调试C的三部分文章。我还推荐他关于调试C的三部分文章。看起来是一篇不错的文章。我认为,在深入研究像这样广泛的问题之前,最好先从上到下地了解正向工程编程:P。这将给他们看到的东西提供更多的背景。看起来是一篇好文章。我认为,在深入研究像这样广泛的问题之前,最好先从上到下地了解正向工程编程:P。这将给他们看到的东西提供更多的背景。