当前位置: 首页 > wzjs >正文

创建免费网站需要什么条件西安区seo搜索排名优化

创建免费网站需要什么条件,西安区seo搜索排名优化,建立网站免费,香港大带宽服务器文章目录 栈生长的方向通过调试查看SP指针验证通过变量地址验证思考:谁分配的栈空间?小结 栈生长的方向 栈生长方向的定义 若入栈之后(PSUH后),栈指针寄存器(SP)值变大了,那么栈就…

文章目录

  • 栈生长的方向
  • 通过调试查看SP指针验证
  • 通过变量地址验证
  • 思考:谁分配的栈空间?
  • 小结

栈生长的方向

栈生长方向的定义

若入栈之后(PSUH后),栈指针寄存器(SP)值变大了,那么栈就是向上生长的。
若入栈之后(PUSH后),栈指针寄存器(SP)值变小了,那么栈就是向下生长的。

在这里插入图片描述


栈生长方向影响的内容

  1. 栈方向影响溢出保护机制的设计,如栈保护页(Guard Page)的放置位置需与生长方向匹配‌

  2. 在FreeRTOS中栈生长的方向也影响任务栈分配与内存管理


通过调试查看SP指针验证

通过调试在stm32f103zet6中查看SP指针验证栈生长方向。

思路:在调试模式下,单步通过进入子函数时观察栈指针的变化,来判断栈生长的方向。

测试代码如下:

void func2(void)
{char buf[100] = {0};buf[0] = 'A';
}void func1(void)
{char buf[100] = {0};buf[0] = 'A';func2();
}int main(void)
{func1();return 0;
}

进入main()函数时的SP值是0x200009B8
在这里插入图片描述

进入func1()函数后,可以发现SP值变成了0x20000950
在这里插入图片描述

所以,在入栈后,stm32f103zet6的SP指针值是减少的,因此stm32f103zet6的栈生长的方向是向下的

通过变量地址验证

思路:

因为每次调用子函数时,编译器会生成代码来 ‌动态调整栈指针(SP)‌,为该函数分配新的栈帧,用于存储:函数的局部变量‌、函数调用时的 参数‌等内容。

所以通过判断进入子函数时,可以根据函数与其子函数中变量的地址大小来判断栈生长方向。

函数变量的地址值 大于 子函数中变量的地址值,则栈向下生长。
函数变量的地址值 小于 子函数中变量的地址值,则栈向下生长。

#include <stdio.h>  static int stack_dir = 0; static void find_stack_direction (void)
{static char* addr = NULL; /* address of first `dummy', once known */char dummy; /* to get stack address */if (addr == NULL)  {                             addr = &dummy; /* initial entry */find_stack_direction (); /* recurse once */  }else{if(&dummy > addr){stack_dir = 1;}else{stack_dir = -1;}}
}int main(void)
{find_stack_direction();if(stack_dir == 1){puts("Stack grew upward\n");}else{puts("Stack grew downward\n");}return 0;
}

stm32f103zet6芯片上运行改代码的结果如下
在这里插入图片描述

思考:谁分配的栈空间?

编译器在帮助我们分配栈空间。

编译器编译阶段会为每个函数生成指令,‌调整栈指针(SP)‌ 以分配或释放栈空间。例如:

  • x86架构‌:通过 sub esp, N 分配栈空间,add esp, N 释放;
  • ARM架构‌:通过 sub sp, sp, #N 分配,add sp, sp, #N 释放。

这里的sub指令即是做减法的指令,add指令是做加法的指令。


计算栈空间的过程是静态的过程

*在编译阶段时,编译器 分析函数的 ‌局部变量、参数传递方式、寄存器保存需求‌ 等,计算出该函数需要占用的总栈空间,并将其写入生成的代码中


每次调用函数时,编译器生成的代码会 ‌动态调整栈指针(SP)‌,为该函数分配新的栈帧,用于存储:

  • 函数的 ‌局部变量‌
  • 函数调用时的 ‌参数‌(若通过栈传递)
  • 返回地址‌(调用结束后恢复执行的位置)
  • 可能被修改的 ‌寄存器值‌(需保存的上下文)

栈分配的本质是 ‌移动栈指针(SP)‌,而非显式的内存申请(如堆的 malloc)。


示例分析

main()函数调用func1()函数时,通过BL.w 0x8000A78指令,跳转到存储func1()函数的代码行中。
在这里插入图片描述

在存储func1()函数的代码中,
我们可以查看第一条指令就是入栈指令PSUH {lr},暂不分析该命令;
第二条指令是分配堆栈的指令SUB sp,sp,#0x64,该命令主要是为char buf[100]该变量分配栈空间。0x64=100,刚好是100个字节。
在这里插入图片描述

func1()函数执行完毕后,通过ADD sp, sp, #0x64来修改SP指针,从而释放了栈空间。
在这里插入图片描述

小结

在该文章中,我们主要了解了如何通过SP指针的变化来判断栈生长的方向,而且我们也分析了arm系列的芯片是怎么去修改栈指针的。

留下个小疑问:栈生长的方向的是由 编译器生成的修改栈指针寄存器的指令 决定的吗?

http://www.dtcms.com/wzjs/100256.html

相关文章:

  • 人和动物做的电影网站seo标题优化步骤
  • html手机网站怎么做seo流量增加软件
  • 做网站属于程序员吗短视频培训要多少学费
  • 关键词排名优化咨询苏州seo关键词优化排名
  • 一个人在家做网站建设软件网站关键词优化
  • 寻找在山西运城专业做网站推广的网站关键词优化代理
  • 长沙网上商城开发搜索引擎优化网页
  • 高端网站建设与管理谷歌推广平台
  • 微信公众号微网站怎么做的网络推广怎么收费
  • 网站如何做好内链网站推广100种方法
  • 青海省建设工程在哪个网站发布深圳全网推广
  • 谷歌做网站推广网店运营流程步骤
  • 企业在线查询系统百度手机端排名如何优化
  • 苏州做企业网站公司网页百度网盘
  • 品牌设计网站大全武汉seo优化代理
  • 汽车网站建设流程长沙网站seo分析
  • 山海关网站制作比百度还强大的搜索引擎
  • 木地板企业网站模版全网营销系统1700元真实吗
  • 免费网站封装app北京官网优化公司
  • 做钢材都有什么网站青岛seo博客
  • 中国有名的网站建设公司商城小程序
  • 网站建设地带最新发布的最新
  • 做网站服务器和域名店面怎么做位置定位
  • 建设通网站免费注册福州网站建设
  • 做食品的采购员常用网站最新疫情最新情况
  • 制作模板网站直通车推广技巧
  • 徐州html5响应式网站建设黑帽seo排名技术
  • 网上接单做效果图哪个网站好360网站推广费用
  • 贵州网站定制搜索引擎推广的方法有
  • 合肥市住房和城乡建设厅网站新闻热点事件2024最新