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

时间:2010-04-09 15:56:56

标签: c

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:2)

一种可能的方式是......

#include <stdio.h>

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;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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