当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 9:01 
头像

注册: 2009-08-14 16:24
帖子: 314
送出感谢: 0 次
接收感谢: 0 次
问题一:

"在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。"
(原文地址:http://user.qzone.qq.com/710428143/blog/1265025287)
这句话,编译程序的时候就指定了程序的栈的大小和在内存的硬地址。内存的硬地址,有那么多的程序,硬地址会不会不够用?而且栈需要连续的空间。栈到底是什么,怎么来的?一块连续的内存空间,在问题二中引用的话中,栈是要放参数的。既然栈用来放参数了,那堆要来干什么?

问题二:
“栈(stack):在函数调用时,第一个进栈的是主函数中子函数调用后的下一条指令(子函数调用语句的下一条可执行语句)的地址,然后是子函数的各个形参。”
(原文地址:http://user.qzone.qq.com/710428143/blog/1265025287)
我也是这么想的,因为子函数的返回地址要先入栈,按照栈的出入栈的顺序,应该返回地址要先入栈,然后返回地址要最后一个出栈。
上面引用的这句话说的是语句的地址,而下面引用的这句话却说是内容?说明:指令寄存器保存着下一条要执行的语句。
但是
“当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。”
(原文地址:http://user.qzone.qq.com/710428143/blog/1265018813)
这里却说是参数第一个入栈。?
(百度谷歌“入栈顺序”只能得到顺序是从右到左。)






文章越看越迷糊。


_________________
我很乖的。。。


最后由 小锐同学 编辑于 2010-02-02 9:09,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 9:03 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
去找本说汇编的书,看pop push的图解。
通常,这些指令,附带了简单的图解的。


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 9:49 
头像

注册: 2009-09-20 19:30
帖子: 765
地址: GIS
系统: ubuntu12.04
送出感谢: 0 次
接收感谢: 0 次
栈是个很复杂的东西。。。建议LZ还是好好看看相关方面的书吧。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 10:08 
头像

注册: 2009-08-14 16:24
帖子: 314
送出感谢: 0 次
接收感谢: 0 次
穷乡僻壤,可恶,C语言的书都没有哪去找汇编的书吖。

想念广州,只要去天河购书中心就行了。


_________________
我很乖的。。。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 10:17 
头像

注册: 2009-09-20 19:30
帖子: 765
地址: GIS
系统: ubuntu12.04
送出感谢: 0 次
接收感谢: 0 次
LZ既然能上网,还搞定几本书?? :em04


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 11:06 
头像

注册: 2009-08-14 16:24
帖子: 314
送出感谢: 0 次
接收感谢: 0 次
内个,我只想去瞄瞄,看看书,不想买。

学C的,汇编这个估计用不到多少吧。

囊中羞涩就不想花钱了。


_________________
我很乖的。。。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 11:22 

注册: 2009-04-30 21:14
帖子: 13
送出感谢: 0 次
接收感谢: 0 次
1.
栈地址的连续性和实际物理地址的连续性没有绝对关系。事实上,程序是用的是虚拟地址,虚拟地址到实际物理地址会经过段机制或者分页机制进行转换,因此不必担心地址的连续性。叫法可能会不一样,某种说法是 逻辑地址-》线性地址-》物理地址
2.
栈和堆还是很不一样的。
程序在某个函数体内申请的数据空间,如int i;这时申请的空间就在堆里。
栈主要是函数跳转使用的,不同的规则会造成不同的进出栈顺序。例如程序切换的时候,会将cpu的环境寄存器压栈,将实参的值按照规定的形参顺序压入栈。压入的顺序于编译器的规则有关。栈地址一般不会存放其他的数据。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-02 13:12 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
问题一:
这个问题你不用管,只要当作你有4G的内存任你用就行了(32位)

问题二:
压栈顺序和调用规范有关


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 迷糊的话题:堆栈
帖子发表于 : 2010-02-08 17:16 

注册: 2009-12-06 21:23
帖子: 109
送出感谢: 0 次
接收感谢: 0 次
short answer:stack是用来放function的local variable,input variable, return address的,而heap是alloc()出来的。

建议读
Programming From The Ground Up
http://www.douban.com/subject/1787855/


Hacking的前面两章
http://www.douban.com/subject/2584955/

书里讲了用gdb调试,反汇编,用用你就会了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译