Solaris(X86版)局部变量入栈顺序的一个小例子
平台:Solaris(X86版)+gccfun1()
{
int i=1, m=2, n=3;
....
}
这里有三个局部变量i,m,n
对与gcc编译成机器码后,栈分配顺序一般是从左到右的顺序入栈
而反汇编的结果中局部变量赋值语句有:
movl $1,-4(%ebp) ; i=1
movl $2,-8(%ebp) ; m=2
movl $3,-0xc(%ebp) ; n=3
那么,i,m,n的栈中的位置如下图:
|----------------------------------|------> HIGH
| EIP (t函数的返回地址) |
|----------------------------------|
| EBP (函数的EBP) |
|----------------------------------|
| i (EBP-4) |
|----------------------------------|
| m (EBP-8) |
|----------------------------------|
| n (EBP-0xc) |
|----------------------------------|------> LOW
当然实际写或移植编译器时也可不安这个顺序,但为了调试的一致性,可考虑与gcc相近.
[ 本帖最后由 system888net 于 2008-4-25 12:22 编辑 ] :)这种方式从栈的方式来看是最合理的。先定义的先入栈,后定义的后入栈。其实从C语言的角度来说,应该没有什么栈与堆这些名词,C语言角度只有局部变量、全局变量、动态分配、静态变量,而栈、堆则是与机器相关、OS相关的术语了。 原帖由 cjaizss 于 2008-4-25 12:27 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
:)这种方式从栈的方式来看是最合理的。先定义的先入栈,后定义的后入栈。其实从C语言的角度来说,应该没有什么栈与堆这些名词,C语言角度只有局部变量、全局变量、动态分配、静态变量,而栈、堆则是与机器相关、 ...
斑竹正确,顶...:)
[ 本帖最后由 system888net 于 2008-4-25 12:43 编辑 ]
回复 #3 system888net 的帖子
.......大侠是对混黑社会的人的称呼,偶现在是从政的:) 原帖由 cjaizss 于 2008-4-25 12:35 发表 http://linux.chinaunix.net/bbs/images/common/back.gif.......大侠是对混黑社会的人的称呼,偶现在是从政的:)
"斑竹正确,顶..." 那这样改可以吗? :smile: 原帖由 cjaizss 于 2008-4-25 12:35 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
.......大侠是对混黑社会的人的称呼,偶现在是从政的:)
:mrgreen: :mrgreen: :mrgreen: 先声明先入栈。 还有反例吗?
回复 #7 albcamus 的帖子
C++这个方面应该是强制的(因为牵涉到析构先后的问题),但是C语言这个还真说不准,因为没有一个标准,栈是机器级的基础概念,不是C语言中的概念。刚才又搜了一下standard C99,全文没搜到stack这个词...... 汗~ LZ 这个也叫例子呀,意义何在? 原帖由 albcamus 于 2008-4-25 13:23 发表 http://linux.chinaunix.net/bbs/images/common/back.gif先声明先入栈。 还有反例吗?
有反例,用gcc4编译
页:
[1]
2