﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-tarius.wu-文章分类-Embedded system</title><link>http://www.cnitblog.com/tarius.wu/category/4327.html</link><description>Spend more time with your family and friends, eat your favorite foods, visit the places you love.</description><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 09:08:08 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 09:08:08 GMT</pubDate><ttl>60</ttl><item><title>栈指针和帧指针</title><link>http://www.cnitblog.com/tarius.wu/articles/19730.html</link><dc:creator>tarius.wu's Blog</dc:creator><author>tarius.wu's Blog</author><pubDate>Wed, 29 Nov 2006 11:55:00 GMT</pubDate><guid>http://www.cnitblog.com/tarius.wu/articles/19730.html</guid><wfw:comment>http://www.cnitblog.com/tarius.wu/comments/19730.html</wfw:comment><comments>http://www.cnitblog.com/tarius.wu/articles/19730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/tarius.wu/comments/commentRss/19730.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/tarius.wu/services/trackbacks/19730.html</trackback:ping><description><![CDATA[
		<blockquote>
				<p>
						<strong>一般来说,大家对堆和栈比较熟悉,而对于计算机体系结构中帧(frame)的概念可能不是那么清楚,本文对栈帧的概念试图做出解释,欢迎更深入的讨论.</strong>
				</p>
		</blockquote>
		<p>
				<strong>栈操作</strong>
		</p>
		<p>程序栈放在存储器中的某个区域,在UNIX style计算机中,栈向下增长.pushl和popl指令都只有一个操作数--用于压入的原数据和用于弹出的目的数据.栈指针%esp保存着当前最后被压入栈的元素地址,因此要想将一个双字压入栈中,首先要将栈指针减4,然后将值写到新的栈指针指向的地址.因此指令pushl %eax的行为等价于下面这两条指令:</p>
		<ul>
				<li>subl $4, %esp 
</li>
				<li>movl %eax, (%esp) </li>
		</ul>
		<p>同理,弹出一个双字的操作过程是首先从栈指针%esp指向的栈地址读出数据,然后将栈指针加4.</p>
		<p> <img style="WIDTH: 634px; HEIGHT: 386px" height="344" src="http://my.donews.com/tarius/files/2006/11/stack2.jpg" width="536" mce_src="http://my.donews.com/tarius/files/2006/11/stack2.jpg" /></p>
		<p>上图是堆栈的操作说明,按照惯例,栈是倒过来画的,因而栈底在上面,栈往低地址方向生长.</p>
		<p>
				<strong>过程调用和栈帧结构</strong>
		</p>
		<p>一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分.另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间.</p>
		<p>大多数机器数据传递,局部变量的分配和释放是通过操纵程序栈来实现的.栈用来传递过程参数,存储返回信息,保存寄存器以供以后恢复之用,以及用于本地存储.为单个过程分配的那部分栈称为栈帧(stack frame),也就是说,栈帧是相对过程调用而言的,一个子程序有一个栈帧,而栈是属于整个计算机系统的.下图描绘了栈帧的通用结构.栈帧的边界以两个指针界定,寄存器%ebp为帧指针,而寄存器%esp为栈指针.当程序执行时,栈指针时可以移动的,因此大多数的访问信息都是相对于帧指针.</p>
		<p>
				<img src="http://my.donews.com/tarius/files/2006/11/caller.jpg" mce_src="http://my.donews.com/tarius/files/2006/11/caller.jpg" />
		</p>
		<p> </p>
		<p>假设过程P(调用者)调用过程Q(被调用者).Q的参数放在P的栈帧中,另外,当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾.返回地址就是当程序从Q返回时应继续执行的地方.Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值.</p>
<img src ="http://www.cnitblog.com/tarius.wu/aggbug/19730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/tarius.wu/" target="_blank">tarius.wu's Blog</a> 2006-11-29 19:55 <a href="http://www.cnitblog.com/tarius.wu/articles/19730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>