迷糊的话题:堆栈

软件和网站开发以及相关技术探讨
回复
头像
小锐同学
帖子: 314
注册时间: 2009-08-14 16:24

迷糊的话题:堆栈

#1

帖子 小锐同学 » 2010-02-02 9:01

问题一:

"在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 次。
我很乖的。。。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 迷糊的话题:堆栈

#2

帖子 eexpress » 2010-02-02 9:03

去找本说汇编的书,看pop push的图解。
通常,这些指令,附带了简单的图解的。
● 鸣学
头像
luofeng1989
帖子: 766
注册时间: 2009-09-20 19:30
系统: ubuntu12.04
来自: GIS

Re: 迷糊的话题:堆栈

#3

帖子 luofeng1989 » 2010-02-02 9:49

栈是个很复杂的东西。。。建议LZ还是好好看看相关方面的书吧。
头像
小锐同学
帖子: 314
注册时间: 2009-08-14 16:24

Re: 迷糊的话题:堆栈

#4

帖子 小锐同学 » 2010-02-02 10:08

穷乡僻壤,可恶,C语言的书都没有哪去找汇编的书吖。

想念广州,只要去天河购书中心就行了。
我很乖的。。。
头像
luofeng1989
帖子: 766
注册时间: 2009-09-20 19:30
系统: ubuntu12.04
来自: GIS

Re: 迷糊的话题:堆栈

#5

帖子 luofeng1989 » 2010-02-02 10:17

LZ既然能上网,还搞定几本书?? :em04
头像
小锐同学
帖子: 314
注册时间: 2009-08-14 16:24

Re: 迷糊的话题:堆栈

#6

帖子 小锐同学 » 2010-02-02 11:06

内个,我只想去瞄瞄,看看书,不想买。

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

囊中羞涩就不想花钱了。
我很乖的。。。
marlin
帖子: 13
注册时间: 2009-04-30 21:14

Re: 迷糊的话题:堆栈

#7

帖子 marlin » 2010-02-02 11:22

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

Re: 迷糊的话题:堆栈

#8

帖子 BigSnake.NET » 2010-02-02 13:12

问题一:
这个问题你不用管,只要当作你有4G的内存任你用就行了(32位)

问题二:
压栈顺序和调用规范有关
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
davyzhu
帖子: 109
注册时间: 2009-12-06 21:23

Re: 迷糊的话题:堆栈

#9

帖子 davyzhu » 2010-02-08 17:16

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调试,反汇编,用用你就会了。
回复