LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1477|回复: 11

迷糊的问题:堆栈

[复制链接]
发表于 2010-2-2 10:14:41 | 显示全部楼层 |阅读模式
问题一:

"在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)
这里却说是参数第一个入栈。?
(百度谷歌“入栈顺序”只能得到顺序是从右到左。)






文章越看越迷糊。


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

想念广州,只要去天河购书中心就行了。
发表于 2010-2-2 10:28:12 | 显示全部楼层
参数入栈顺序,依赖于具体编译器的实现。windows和gcc都是由右向左的。
不怕身居穷乡僻壤,就怕没有谷哥帮忙。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-2 10:48:46 | 显示全部楼层
老大,你是说那个顺序,参数,返回地址,基地址之类的顺序是依赖于具体的实现么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-2 15:05:30 | 显示全部楼层
CPU : P4 2.0
主板 : 华擎P4VT8+
内存 : Kinston DDR400 512MB
显卡 : 七彩虹6200A-GD2 CT超频版
声卡 : 主板集成CMI9739六声道
硬盘 : 迈拓金钻10 80GB IDE
OS : Debian GNU/Linux Etch
GUI :GTK based on DirectFB

用这系统,显卡被你浪费了。
回复 支持 反对

使用道具 举报

发表于 2010-2-2 19:56:59 | 显示全部楼层
居然是qq空间的文章
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-4 09:06:58 | 显示全部楼层
something  ... ...

我按照google地图说的去找书店。那里居然没书店的。
回复 支持 反对

使用道具 举报

发表于 2010-2-7 09:56:44 | 显示全部楼层
Post by 13025700481;2067293
something  ... ...
我按照google地图说的去找书店。那里居然没书店的。

技术领域,通常直接看网上文章比较靠谱,看书,很不靠谱,本人从事 IT 行业十多年,觉得相关领域没有必要买任何一本书,努力学好英文和学会google比买任何书都重要。

人家学习相关技术花了一年,写文章花了两年,然后翻译成中文又花了一年,再出版发行,到你手上又一年,五年过去了你终于拿到手,然而技术已经过时了。

当然,如果你真要解决书的问题: www.amazon.cn
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-8 11:04:14 | 显示全部楼层
哈哈,Poet同学。

你很牛。

那么,英语单词也有很多方面的呀。那么我是不是只要学好计算机方面的单词就行了呢?课本的那些个单词就不用花那么多心思了。
回复 支持 反对

使用道具 举报

发表于 2010-2-20 13:39:46 | 显示全部楼层
搜下“C语言标准与实现”(只有电子版)或“深入理解计算机系统”(有扫的电子版也有实体书)这两本书看下,对这个问题讲的都很清楚

“当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。”

上面这个说法是正确的。
回复 支持 反对

使用道具 举报

发表于 2010-2-20 14:16:58 | 显示全部楼层
问题一:你理解错了.什么是硬地址?它所分配的地址只是虚拟地址.加载时,加载器会把物理地址和虚拟地址进行映射.栈是一块连续的内存空间,它的分配是由可执行文件的段来决定的.可执行文件可以参照一下PE或ELF文件格式.
问题二:liwangli的说法是对的.
回复 支持 反对

使用道具 举报

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

本版积分规则

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