懂C++和汇编的朋友进,该怎么处理
懂C++和汇编的朋友进
参数传递的过程不是很明白
我们还没学到汇编语言,看的不是很明白
麻烦大家解释下汇编代码,谢谢大家!
------解决方案--------------------
现在赶快亡羊补牢还来得及
------解决方案--------------------
自己注释了那么多了,也差不多了吧
------解决方案--------------------
汇编。。。不懂。。曾经就很厌恶这门科,,想当年差点挂科。。杯具
------解决方案--------------------
汇编。。。不懂。。曾经就很厌恶这门科,,想当年差点挂科。。杯具
------解决方案--------------------
不是很懂,C到汇编还好说点,C++就更晕了
------解决方案--------------------
参数传递的过程不是很明白
我们还没学到汇编语言,看的不是很明白
麻烦大家解释下汇编代码,谢谢大家!
- C/C++ code
//C++代码: #include<iostream> using namespace std; class A { public: A(int x = 0) : a(x){cout<<"normal"<<endl;} A(const A &ref) : a(ref.a){cout<<"copy"<<endl;} int a; }; void test(A x) { } int main() { A a; test(a); system("pause"); return 0; }
- Assembly code
//汇编代码: 17: int main() 18: { 004011B0 push ebp 004011B1 mov ebp,esp 004011B3 sub esp,48h 004011B6 push ebx 004011B7 push esi 004011B8 push edi 004011B9 lea edi,[ebp-48h] 004011BC mov ecx,12h 004011C1 mov eax,0CCCCCCCCh 004011C6 rep stos dword ptr [edi] 19: A a; 004011C8 push 0 004011CA lea ecx,[ebp-4] //ecx传递this指针? 004011CD call @ILT+10(A::A) (0040100f) //构造局部对象a 20: 21: test(a); 004011D2 push ecx //传递拷贝构造函数的引用参数 即对象a的地址 004011D3 mov ecx,esp //这条语句是干嘛的? 为形参分配空间? 004011D5 lea eax,[ebp-4] 004011D8 push eax //这条语句的作用是什么? 构造形参的话this指针有了,参数也有了,怎么此处又将a的地址入栈? 004011D9 call @ILT+150(A::A) (0040109b) //在ecx指向的空间以已经压栈的a的地址做引用参数拷贝构造形参? 004011DE call @ILT+180(test) (004010b9) // 004011E3 add esp,4 22: system("pause"); 004011E6 push offset string "pause" (0043101c) 004011EB call system (00409140) 004011F0 add esp,4 23: return 0; 004011F3 xor eax,eax 24: } 13: void test(A x) 14: { 00401180 push ebp 00401181 mov ebp,esp 00401183 sub esp,40h 00401186 push ebx 00401187 push esi 00401188 push edi 00401189 lea edi,[ebp-40h] 0040118C mov ecx,10h 00401191 mov eax,0CCCCCCCCh 00401196 rep stos dword ptr [edi] 15: } 00401198 pop edi 00401199 pop esi 0040119A pop ebx 0040119B mov esp,ebp 0040119D pop ebp 0040119E ret
------解决方案--------------------
现在赶快亡羊补牢还来得及
------解决方案--------------------
自己注释了那么多了,也差不多了吧
------解决方案--------------------
汇编。。。不懂。。曾经就很厌恶这门科,,想当年差点挂科。。杯具
------解决方案--------------------
汇编。。。不懂。。曾经就很厌恶这门科,,想当年差点挂科。。杯具
------解决方案--------------------
不是很懂,C到汇编还好说点,C++就更晕了
------解决方案--------------------
- Assembly code
19: A a;
004011C8 push 0 ;实际要调用A(int x = 0)这个构造函数,
;这个是默认参数入栈
004011CA lea ecx,[ebp-4] ;将a对象的地址存入ecx,vc一般this存入ecx
;gcc中this作为最后一参数入栈的,显然ebp-4 ~ebp这段空间就是a的存储空间
004011CD call @ILT+10(A::A) (0040100f) //构造局部对象a
20:
21: test(a);
004011D2 push ecx ;将ecx入栈保存
004011D3 mov ecx,esp ;将esp保存到ecx,说明编译器打算将esp-4~esp
;作为test函数中参数a对应的内存,test传参时要调用A的拷贝构造函数生成一个临时对象