OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6190|回复: 15

关于内存栈的理解,不知道是不是哪里出现问题,还请大神指点

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-1-22 23:48:35 | 显示全部楼层 |阅读模式
3金钱
int main()

{
func1();
func2();
return 0;
}

int func1(int a,int b)
{
return 0;
}

请问大神:
问题1:main()函数和func1()函数会公用同一个栈空间吗?也可以说,调用函数和被调用函数会占用同一个栈空间吗?
问题2:栈的保存顺序是不是像我理解的这样???
1>先压入被调用函数的函数入口地址
2>再压入函数的实参
然后进入函数,
3>先压入函数的形参
4>再压入局部变量
5>出栈,按照先进后出的原则,先压出局部变量
6>再压出形参
7>再压出实参,
8>再压出函数的入口地址
9>如果有函数返回值,那应该放在哪个步骤里?(这个算是问题3吧)

电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-23 00:16:39 | 显示全部楼层
小弟还有不能理解的地方,还希望大神也能帮我一并解答,不胜感激~~~
问题4:RAM内存中存放是只有堆内存和栈内存吗?还有没有其他形式的内存也是存放在RAM(这个RAM包括静态SRAM和动态DRAM)中的?
问题5:静态存储区是在程序编译的时候已经分配好的,那么它是存放在RAM中,还是存放在ROM中(程序代码是存储在ROM中,这个我可以理解)?
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-23 15:48:14 | 显示全部楼层
liuchang 发表于 2016-1-23 00:16
小弟还有不能理解的地方,还希望大神也能帮我一并解答,不胜感激~~~
问题4:RAM内存中存放是只有堆内存和栈内 ...

关于问题4、5可以参考一下
http://www.openedv.com/thread-54528-1-1.html

关于问题1、2、3其实可以做个试验观察一下,有空的话我做完附图
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-24 22:07:28 | 显示全部楼层
ianhom 发表于 2016-1-23 15:48
关于问题4、5可以参考一下
http://www.openedv.com/thread-54528-1-1.html

怎么说呢,倒不是我很懒,但是我不懂汇编,哎,这是一块硬伤~~~
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-24 22:18:49 | 显示全部楼层
liuchang 发表于 2016-1-24 22:07
怎么说呢,倒不是我很懒,但是我不懂汇编,哎,这是一块硬伤~~~

理解,汇编我也不是很懂,都是找本书对照看的
关于函数调用的时候如何操作栈,其实不一定需要看懂汇编,可以直接找到SP值对应的那个地址,通过发生函数调用前后这个地址附近上的数据的变化可能猜出个一二来。
其实我也较懒,到现在还没有搭个试验的环境,呵呵
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-25 00:13:38 | 显示全部楼层
ianhom 发表于 2016-1-24 22:18
理解,汇编我也不是很懂,都是找本书对照看的
关于函数调用的时候如何操作栈,其实不一定需要看懂汇编, ...

这位大哥:小弟玩的单片机是stm32f103vet6,也属于ARM架构
如果我想基于这款单片机来学习汇编语言(我寻思,汇编也应该分很多种,ARM指令集,啥精简指令集等等,不是很懂,听说过这些)
你能推荐啥资料或者书籍吗?
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-25 00:13:41 | 显示全部楼层
本帖最后由 ianhom 于 2016-1-25 00:20 编辑

试验

试验

简单做了下试验,不知道能不能帮上忙,太晚了,最近家里事情多,不能一一罗列请见谅,具体细节可以一起讨论,我也需要好好学习这部分,也恳请论坛大神做进一步讲解。

机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-25 00:16:41 | 显示全部楼层
liuchang 发表于 2016-1-25 00:13
这位大哥:小弟玩的单片机是stm32f103vet6,也属于ARM架构
如果我想基于这款单片机来学习汇编语言(我寻思, ...

这个我建议上网找找资料
STM32是M3内核,我习惯用的是一款M0的内核,我大概比较过M3和M0的权威指南,感觉差不多,我的汇编资料是我那款单片机书籍中附带的一些讲解,我也希望有一本详细讲解ARM cortex M核的汇编书籍
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-25 00:20:35 | 显示全部楼层
大神:堆和自由存储区有啥区别啊(网上我能找到堆和栈的区别,我大体可以理解,这个真不知道了),恳请大神指导下~~~
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-25 00:23:31 | 显示全部楼层
liuchang 发表于 2016-1-25 00:20
大神:堆和自由存储区有啥区别啊(网上我能找到堆和栈的区别,我大体可以理解,这个真不知道了),恳请大神指导下 ...

堆是可以在运行过程中分配的内存,就是动态分配malloc用的区域
自由存储区具体指的是啥我也不明白,小弟孤陋寡闻第一次听过这个名字。。。。是指静态储存区吗?
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-25 08:43:11 | 显示全部楼层
不是静态存储区,我是在看C++ (普拉达版本)看到的,也是不太理解~
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-25 13:47:47 | 显示全部楼层
liuchang 发表于 2016-1-25 08:43
不是静态存储区,我是在看C++ (普拉达版本)看到的,也是不太理解~

我上网查了下,也问了搞c++的同事,感觉这个自由存储区和heap差不多。。。。。坐等大神来解释
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-25 14:38:32 | 显示全部楼层
ianhom 发表于 2016-1-25 13:47
我上网查了下,也问了搞c++的同事,感觉这个自由存储区和heap差不多。。。。。坐等大神来解释

恩,受教了,谢谢~
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-25 14:58:57 | 显示全部楼层
liuchang 发表于 2016-1-23 00:16
小弟还有不能理解的地方,还希望大神也能帮我一并解答,不胜感激~~~
问题4:RAM内存中存放是只有堆内存和栈内 ...

问题4:RAM内存中存放是只有堆内存和栈内存吗?还有没有其他形式的内存也是存放在RAM(这个RAM包括静态SRAM和动态DRAM)中的?
我觉得按大类分的话就是堆、栈和全局/静态存储区,全局/静态存储区放全局变量,static修饰的静态变量和常量,这个区域根据是否有非零初始值分为已初始化区和未初始化区。

问题5:静态存储区是在程序编译的时候已经分配好的,那么它是存放在RAM中,还是存放在ROM中(程序代码是存储在ROM中,这个我可以理解)?
静态存储区中是在编译的最后一个环节--链接时分配好的,这时的全局变量、静态变量,静态常量都是放到RAM中,单RAM掉电后数据丢失,所以有非零初始值的全局变量、静态变量,静态常量的数据都会在ROM中有备份,在cpu上电启动的过程中,会将ROM中这些初始值逐个复制到RAM对应的位置,这样等你运行到main的时候,你的全局变量、静态变量,静态常量的初始值就存在于RAM中了。而对于初始值为0的全局变量、静态变量,静态常量,则在启动过程中逐个写入0到RAM对应的地址(防止RAM上电后内容不确定),这也是为什么全局/静态存储区会分为已初始化和未初始化区域
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2016-1-25 16:57:15 | 显示全部楼层
ianhom 发表于 2016-1-25 00:23
堆是可以在运行过程中分配的内存,就是动态分配malloc用的区域
自由存储区具体指的是啥我也不明白,小弟 ...

楼主,keil环境下和iar 的分析结果是一样吗?
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-26 08:46:04 | 显示全部楼层
ssssssssssss 发表于 2016-1-25 16:57
楼主,keil环境下和iar 的分析结果是一样吗?

这个,不知道你指的分析是哪方面
电子爱好者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表