如何查找堆栈是向上还是向下增加?

如何查找堆栈是向上还是向下增加?

非常依赖于平台,甚至依赖于应用程序。

Vino发布的代码仅适用于在堆栈上传递参数的目标,并且按顺序从堆栈分配局部变量。 许多编译器会为参数分配固定的内存地址,或者在寄存器中传递参数。 虽然常见,但是在堆栈上传递参数是将数据输入和输出函数的最低效方法之一。

查看已编译应用程序的反汇编,并查看编译器生成的代码。 如果您的目标具有编译器正在使用的本机堆栈操作命令(如PUSH和POP),那么CPU数据表/参考手册将告诉您堆栈的增长方向。 但是,编译器可能会选择实现自己的堆栈,在这种情况下,您将不得不进行一些挖掘。

或者,读取堆栈指针,在堆栈上推送一些东西,然后再次读取堆栈指针。 比较第一次和第二次读取的结果,以确定指针移动的方向。

供将来参考:如果您包含有关目标架构的一些细节(嵌入式?PC?Linux,Windows?GCC?VC?Watcom?blah blah blah),您将获得更有意义的答案。

一种可能的方式是……

#include  void call(int *a) { int b; if (&b > a) printf("Stack grows up.\n"); else printf("Stack grows down.\n"); } int main () { int a; call(&a); return 0; } 

蛮力方法是用一个已知的值填充你的记忆,比如说0xFF。 推送堆栈上的一些项目。 做内存转储。 在堆栈上推送更多项目。 做另一个内存转储。

创建具有许多局部变量的函数。
关闭优化。 打印汇编语言。或者在调试时,显示为混合源和汇编语言。 注意执行函数之前的堆栈指针(或寄存器)。 单步执行function并观察堆栈指针。

通常,只要问题是一致且有效的,编译器是否使用递增或递减堆栈指针是一个非常小的问题。 这是一个很少占据我心思的问题。 我倾向于专注于更重要的主题,例如质量,正确性和稳健性。

我相信编译器能够正确处理堆栈操作。 我不相信递归函数,尤其是在嵌入式或受限制的平台上。