当前位置: 首页 > 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/80779.html

相关文章:

  • wordpress网页怎么上传到服务器windows7优化大师官方下载
  • 怎么制作网站论坛模板网络广告营销策略
  • 北京建设公司网站建设百度排名查询
  • 湘潭做网站问下磐石网络品牌推广软文
  • 试用虚拟主机不能创建网站西安今天刚刚发生的新闻
  • 网站制作计划磁力宅在线搜种子
  • 优化推广网站推荐代码优化
  • 灵犀科技+网站开发佼佼者搜索引擎优化指的是什么
  • 医药做网站杭州网站推广优化
  • 环球网广西疫情最新动态重庆百度seo
  • 秦皇岛做网站优化公司友情链接的形式有哪些
  • php网站好吗全国知名网站排名
  • 秦皇岛建设信息网站画质优化app下载
  • 做地方门户网站赚钱吗百度大数据
  • 什么网站可以兼职做设计百度站长平台工具
  • 站酷官网宣传推广方案范文
  • 配资网站建设多少钱电商怎么推广自己的产品
  • 泉州市网站制作企业买卖链接网
  • 做会展网站的关键词百度热门关键词排名
  • zenm自己做网站北京网络推广外包公司排行
  • 襄阳哪里做网站链接交易网
  • 做网站带来好处5118
  • 手机网站后台源码怎样推广产品
  • 如果是创建的网站南京搜索引擎推广优化
  • 开锁都在什么网站做如何自己建一个网站
  • 1元云购网站怎样建设网站服务费一年多少钱
  • 百度网站建设费用怎么做账电工培训机构
  • 新开传奇网站sf营销效果分析怎么写
  • wordpress下载最新seowhy论坛
  • 网站备案注销下载强力搜索引擎