设为首页 加入收藏

TOP

C/C++的参数传递机制(二)
2015-02-02 14:15:55 来源: 作者: 【 】 浏览:15
Tags:C/C 参数 传递 机制
下Test002函数对应的反汇编代码的参数传递


__int64* _pArray = NULL;
004137E0? mov? ? ? ? dword ptr [_pArray],0
GetMemory(&_pArray);
004137E7? lea? ? ? ? eax,[_pArray]
004137EA? push? ? ? ? eax?
004137EB? call? ? ? ? GetMemory (4111FEh)


004137F0? add? ? ? ? esp,4


从上面的汇编代码lea eax,[_pArray] 可以看出,_pArray的地址被压入到栈中去了。


然后看一看GetMemory(&_pArray)的实现汇编代码。


? 0x0040159b <+0>:? ? ? ? push? ebp


? 0x0040159c <+1>:? ? ? ? mov? ? ebp,esp


? 0x0040159e <+3>:? ? ? ? sub? ? esp,0x18


? 0x004015a1 <+6>:? ? ? ? mov? ? DWORD PTR [esp],0x20


? 0x004015a8 <+13>:? ? ? ? call? 0x473ef0 <_Znaj>


? 0x004015ad <+18>:? ? ? ? mov? ? edx,DWORD PTR [ebp+0x8]


? 0x004015b0 <+21>:? ? ? ? mov? ? DWORD PTR [edx],eax


? 0x004015b2 <+23>:? ? ? ? leave?


? 0x004015b3 <+24>:? ? ? ? ret?


蓝色的代码是分配临时变量空间,然后调用分配空间函数分配空间,得到的空间指针即eax.


然后红色的汇编代码即从ebp+0x8的栈上取到上面压入栈中的参数_pArray的地址.


mov DWORD PTR [edx],eax即相当于把分配的空间指针eax让edx指向,也即让_pArray指向分配的空间eax.


总之,无论是哪种参数传递方式,参数都是通过栈上的临时变量来间接参与到被调用函数的。指针作为参数,其本身的值是不可能被改变的,能够改变的是其指向的内容。引用是通过指针来实现的,所以引用和指针在效率上一样的。


C语言梳理一下,分布在以下10个章节中:


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java比较器的复用 下一篇C++与正态分布

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: