64位环境下参数传递

4543阅读 0评论2012-07-16 luoyan_xy
分类:C/C++

    在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个的时候,使用栈来传递参数
上一篇:如何高效的访问内存
下一篇:一个python小功能