今天在C++课上突然想到了这个问题,引用的传递到底传递的是什么?小弟反汇编工具用的不熟练,就只能靠VC提供的反汇编了。
写了一段测试代码:
#include <iostream>
using namespace std;
bool Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
return true;
}
int main()
{
int m = 1;
int n = 2;
Swap(m, n);
cout<<"m:"<<m<<endl;
cout<<"n:"<<n<<endl;
return 0;
}
主函数中调用函数部分的反汇编是:
Swap(m, n);
0022154C lea eax,[n]
0022154F push eax
00221550 lea ecx,[m]
00221553 push ecx
00221554 call Swap (221131h)
00221559 add esp,8
Swap函数的反汇编是:
bool swap(int &a, int &b)
{
010414C0 push ebp
010414C1 mov ebp,esp
010414C3 sub esp,0CCh
010414C9 push ebx
010414CA push esi
010414CB push edi
010414CC lea edi,[ebp-0CCh]
010414D2 mov ecx,33h
010414D7 mov eax,0CCCCCCCCh
010414DC rep stos dword ptr es:[edi]
int temp = a;
010414DE mov eax,dword ptr [a]
010414E1 mov ecx,dword ptr [eax]
010414E3 mov dword ptr [temp],ecx
a = b;
010414E6 mov eax,dword ptr [a]
010414E9 mov ecx,dword ptr [b]
010414EC mov edx,dword ptr [ecx]
010414EE mov dword ptr [eax],edx
b = temp;
010414F0 mov eax,dword ptr [b]
010414F3 mov ecx,dword ptr [temp]
010414F6 mov dword ptr [eax],ecx
return true;
010414F8 mov al,1
}
010414FA pop edi
010414FB pop esi
010414FC pop ebx
010414FD mov esp,ebp
010414FF pop ebp
01041500 ret
看样子还是把m和n的地址传入到了函数中,这样理解对吗?
是不是引用只是编译器的一种对数据的抽象处理方法,具体实现是靠的传地址?
谢谢各位了!
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!