Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372056
  • 博文数量: 73
  • 博客积分: 3574
  • 博客等级: 中校
  • 技术积分: 1503
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-26 11:17
文章分类

全部博文(73)

文章存档

2012年(14)

2011年(15)

2010年(44)

分类: C/C++

2012-07-16 23:39:56

    在C语言中函数调用中一个重要的步骤就是参数传递,在i386体系下,所有的参数值传递都是通过入栈操作来实现,而且入栈的顺序是从右往左入栈,举两个例子:

点击(此处)折叠或打开

  1.   //test1为传递单个参数
  2.   401128:    8b 45 fc     mov -0x4(%ebp),%eax
  3.   40112b:    89 04 24     mov %eax,(%esp)
  4.   40112e:    e8 5d ff ff ff     call 401090 <_test1>
  5.   //test2为传递两个参数
  6.   401133:    8b 45 f8     mov -0x8(%ebp),%eax
  7.   401136:    89 44 24 04     mov %eax,0x4(%esp)
  8.   40113a:    8b 45 fc     mov -0x4(%ebp),%eax
  9.   40113d:    89 04 24     mov %eax,(%esp)
  10.   401140:    e8 58 ff ff ff     call 40109d <_test2>
    而在x86_64位系统中,由于寄存器的数量得到了提升,因此对于函数调用中的参数传递,优先使用寄存器进行传递,只有在参数个数多于一定数量时才会使用压栈的方式,同时这个传递也是有一定顺序的,了解使用顺序,能够更好的通过反汇编寄存器还原变量。
    测试结果如下:
edi,esi,edx, ecx, r8, r9, 栈传递
    根据参数个数,按照顺序使用以上寄存器,当参数个数大于6个的时候,使用栈来传递参数
阅读(4407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~