免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5793 | 回复: 11
打印 上一主题 下一主题

关于函数调用时压栈操作的疑惑,恳请大家指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-12 11:19 |只看该作者 |倒序浏览
int test(char ch_a, short sh_a)
{
    char ch;
    short sh;

    printf("sh_a:  0x%x\n",&sh_a);
    printf("ch_a:  0x%x\n",&ch_a);
    printf("ch:    0x%x\n",&ch);
    printf("sh:    0x%x\n",&sh);

    return 0;
}

int main()
{
    test(1,2);
    return 0;
}

编译运行后结果如下:
sh_a:  0xbf8b1280
ch_a:  0xbf8b1284
ch:    0xbf8b1297
sh:    0xbf8b1294

按照之前的理解,对上述结果有几点疑惑恳求大家指教:
1. 函数调用时,实参应该在局部变量之前进栈,故实参的地址应该大于局部变量才对,但跟上述结果正好相反。
2. 对于实参的压栈,应该是从右到左才对,但跟上述结果正好相反。
3. 从字节对齐来看,实参和局部变量都应该是2字节对齐才对,但上述结果表明局部变量按2字节对齐,但实参却按4字节对齐。

论坛徽章:
0
2 [报告]
发表于 2009-02-12 11:41 |只看该作者
1. 函数调用时,实参应该在局部变量之前进栈,故实参的地址应该大于局部变量才对,但跟上述结果正好相反。

我在我的机器上测试过了,参数的地址大,局部变量的地址小
其实这个好像和机器架构和编译器有关的

论坛徽章:
0
3 [报告]
发表于 2009-02-12 11:47 |只看该作者

回复 #1 allenlu1212 的帖子

1.  “ 实参应该在局部变量之前进栈,故实参的地址应该大于局部变量才对”  是不对的,,好像没有谁规定栈必须是从低地址到高地址的。也有从高地址到低地址的栈,还有双向栈(2头向中间,中间向2头)。
2.  函数体中的局部变量,可能像结构一样会被 编译器优化,做内存对齐操作,如何优化这部分要看具体的编译器实现了。
3.  实参的压栈  还跟进栈方式有关,有从右到左,也有从左到右的。明显 这里 是从右到左的。
4.  实参一般会被优化成 机器字长(32位)的整数倍。如果不进行这样统一的操作,那么给你一个函数,将无法调用,因为没法计算实参需要占用的栈空间大小(同编译器可能能算出来,但不同的编译器就没法了)

把这个小程序反汇编一下,看得很明显。

加一点 特征吗。在按命令序列查找 很快的。
__asm{
     add eax,0x1
     add eax,0x1
     add eax,0x1
}

论坛徽章:
0
4 [报告]
发表于 2009-02-12 12:03 |只看该作者

回复 #1 allenlu1212 的帖子

主要还是看cpu。

[ 本帖最后由 xiexiecn 于 2009-2-12 12:06 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-02-12 13:35 |只看该作者
x86 是 top down stack.

论坛徽章:
0
6 [报告]
发表于 2010-03-19 14:16 |只看该作者
回复 1# allenlu1212


    楼主弄明白没?我也有一样的疑问,能不能告诉我答案谢谢。

论坛徽章:
0
7 [报告]
发表于 2010-03-19 14:42 |只看该作者
不同CPU是不同的。
有的CPU栈从低到高增长。

论坛徽章:
0
8 [报告]
发表于 2010-03-19 15:04 |只看该作者
LZ,能否把机器信息和编译器信息贴出来

论坛徽章:
0
9 [报告]
发表于 2010-03-19 18:35 |只看该作者
回复 7# 思一克


    请问版主,那操作系统怎么为一个进程划分地址空间的?哪一块是栈?

论坛徽章:
0
10 [报告]
发表于 2010-03-19 19:17 |只看该作者
回复 9# pengjianbokobe


和进程地址空间没有关系的。
进程一般是代码在前面(低地址),然后是数据(可变,不可变),然后是碓, 最后是栈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP