免费注册 查看新帖 |

Chinaunix

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

[C] 关于gcc参数传递方式的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-08 23:59 |只看该作者 |倒序浏览
我写了如下的code.
//stack.c
#include <stdio.h>
void Func(int para)
{
}
int main()
{
    int para = -1;
    asm("push %eax");
    Func(para);
    asm("pop %eax");
    return 0;
}
gcc -O0 -g -o stack stack.c
main函数反汇编
0x08048329 <main+0>:    lea    0x4(%esp),%ecx
0x0804832d <main+4>:    and    $0xfffffff0,%esp
0x08048330 <main+7>:    pushl  0xfffffffc(%ecx)
0x08048333 <main+10>:   push   %ebp
0x08048334 <main+11>:   mov    %esp,%ebp
0x08048336 <main+13>:   push   %ecx
0x08048337 <main+14>:   sub    $0x14,%esp
0x0804833a <main+17>:   movl   $0xffffffff,0xfffffff8(%ebp)
0x08048341 <main+24>:   push   %eax
0x08048342 <main+25>:   mov    0xfffffff8(%ebp),%eax
0x08048345 <main+28>:   mov    %eax,(%esp)
0x08048348 <main+31>:   call   0x8048324 <Func>
0x0804834d <main+36>:   pop    %eax
0x0804834e <main+37>:   mov    $0x0,%eax
0x08048353 <main+42>:   add    $0x14,%esp
0x08048356 <main+45>:   pop    %ecx
0x08048357 <main+46>:   pop    %ebp
0x08048358 <main+47>:   lea    0xfffffffc(%ecx),%esp
0x0804835b <main+50>:   ret   
很显然,SUB/MOV的参数传递方法会覆盖保存的eax值,如果以后eax有特殊用途(比如在
fpic编译生成的code中),程序会有意想不到的后果。如何理解gcc这种传参方式,为什么
不用push指令呢。
谢谢大家!

论坛徽章:
0
2 [报告]
发表于 2009-02-09 00:04 |只看该作者
lz所指的“SUB/MOV的参数传递方法会覆盖保存的eax值”是你的内联汇编的原因吧?

论坛徽章:
0
3 [报告]
发表于 2009-02-09 01:00 |只看该作者

这是 abi 规范规定的东西,你硬要这样用,能怪谁?只能怪你呗

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

回复 #1 ywcjs 的帖子

想太多了,和人要适应这个社会一样,你得适应编译器。何不仔细研究一下内联汇编的一些语法语义呢,总是可以做到你想要的结果。

论坛徽章:
0
5 [报告]
发表于 2009-02-09 12:26 |只看该作者
如果非要用inline assembly, 也不要在两段有关系的汇编中间夹杂一个C函数调用,或者其他任何C代码。

论坛徽章:
0
6 [报告]
发表于 2009-02-09 18:16 |只看该作者
谢谢各位回复

你这个abi规范,哪里能看到,谢谢!
原帖由 mik 于 2009-2-9 01:00 发表
utu:" />
这是 abi 规范规定的东西,你硬要这样用,能怪谁?只能怪你呗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP