堆栈的生长方向

堆栈的生长方向从最本质的理解是堆栈入栈方向是从高地址向地址还是低地址向高地址。

从高地址向低地址生长一般叫做向下生长,也叫作逆向生长。

从低地址向高地址生长一般叫做向上生长,也叫作正向生长。

一般来说堆栈是逆向生长的。

51单片机的堆栈生长方向为正向生长,因为执行PUSH指令时先将SP的值加1再将指定的8位数据单元的内容入栈。

80x86微机的堆栈生长方向为逆向生长,因为执行PUSH指令时先将SP的值减2再将指定的16位数据单元内容入栈。高字节放高地址,低字节放低地址(小端模式)。

STM32的堆栈生长方向是逆向生长


以下来自网友的测试代码本人在PC机上运行,结果跟80x86一致。代码的原理是利用递归函数两次分配给变量的地址的不同来区别堆栈的生长方向。

#include <stdio.h> 
 
static int stack_dir = 0; 
 
static void find_stack_direction (void)  
{  
    static char *addr = NULL;     
    char dummy;            

    if (addr == NULL)  
    {                             
        addr = &dummy;  
        find_stack_direction ();    
    }  
    else 
	{
        if (&dummy > addr)
            stack_dir = 1;              
        else  
            stack_dir = -1; 
	}
}  

void main(void)  
{  
    find_stack_direction();  
    if(stack_dir==1)  
        printf("stack grew upward\n");  
    else  
        printf("stack grew downward\n");
} 

运行结果如下:

另外一点:数组,字符串内部数据地址按顺序增长

#include <stdio.h>

/*
1. 80x86系统堆栈逆向生长
2. 数组,字符串内部数据地址按顺序增长
*/
int main()
{
	int i;
	int j;
    int k[4];

	printf("int i;\n");
	printf("int j;\n");
	printf("int k[4];\n");
	printf("\ni的地址>j的地址>k的地址\n");
	printf("&i=%d\n",&i);
	printf("&j=%d\n",&j);
	printf("&k=%d\n",&k);
	printf("\n数组内部数据地址按顺序增长\n");
	printf("&k[0]=%d\n",&k[0]);
	printf("&k[1]=%d\n",&k[1]);
	printf("&k[2]=%d\n",&k[2]);
	printf("&k[3]=%d\n",&k[3]);
    
    return 0;
}



  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值