C++与汇编

来源:互联网 发布:centos ibus 设置 编辑:程序博客网 时间:2024/05/22 14:59

1.指针

 任何指针对汇编而言都是一样的,只不过在操作的时候才有区别

 mov         byte ptr [eax],2  

  mov         dword ptr [ecx],4019999Ah  

2.指针和引用

汇编层是一样的

  1. 004012FB   lea         ecx,[ebp-4]  
  2. 004012FE   push        ecx  
  3. 004012FF   call        @ILT+50(add_ref) (00401037) 
都是取地址,压栈,调用函数

3.类

如果没有虚函数,函数的调用是硬编码

  1. 65:       fruit f;  
  2. 0040132D   lea         ecx,[ebp-10h]  
  3. 00401330   call        @ILT+35(fruit::fruit) (00401028)  
  4. 00401335   mov         dword ptr [ebp-4],0  
  5. 66:       apple* a = (apple*)&f;  
  6. 0040133C   lea         eax,[ebp-10h]  
  7. 0040133F   mov         dword ptr [ebp-14h],eax  
  8. 67:       a->print();  
  9. 00401342   mov         ecx,dword ptr [ebp-14h]  
  10. 00401345   call        @ILT+0(apple::print) (00401005)  
  11. 68:       fruit* b = &f;  
  12. 0040134A   lea         ecx,[ebp-10h]  
  13. 0040134D   mov         dword ptr [ebp-18h],ecx  
  14. 69:       b->print();  
  15. 00401350   mov         ecx,dword ptr [ebp-18h]  
  16. 00401353   call        @ILT+25(fruit::print) (0040101e) 
4.switch,break
 
 int m = 10; 
 switch(m)  -->  
  1.            mov         eax,dword ptr [ebp-4]  
  2. 004017B2   mov         dword ptr [ebp-8],eax  为switch()中的m开辟一段栈内存
  {}

  break; --> 

  1.   break;  
  2. 004017D0   jmp         process+4Fh (004017df)   
  被汇编为一个无条件跳转指令
5.虚函数
在掉用函数时,通过edx被赋予不同的值来实现多态,否则是硬编码
  1. 76:       employee p;  
  2. 0040127D   lea         ecx,[ebp-10h]  
  3. 00401280   call        @ILT+45(employee::employee) (00401032)  
  4. 00401285   mov         dword ptr [ebp-4],0  
  5. 77:       manager m;  
  6. 0040128C   lea         ecx,[ebp-14h]  
  7. 0040128F   call        @ILT+65(manager::manager) (00401046)  
  8. 00401294   mov         byte ptr [ebp-4],1  
  9. 78:       employee* e = &p;  
  10. 00401298   lea         eax,[ebp-10h]  
  11. 0040129B   mov         dword ptr [ebp-18h],eax  
  12. 79:       e->print();  
  13. 0040129E   mov         ecx,dword ptr [ebp-18h]  
  14. 004012A1   call        @ILT+5(employee::print) (0040100a)  
  15. 80:       e = &m;  
  16. 004012A6   lea         ecx,[ebp-14h]  
  17. 004012A9   mov         dword ptr [ebp-18h],ecx  
  18. 81:       e->print();  
  19. 004012AC   mov         ecx,dword ptr [ebp-18h]  
  20. 004012AF   call        @ILT+5(employee::print) (0040100a)  
6.静态变量
就是取同一个地址
  1. 74:       m.value = 10;  
  2. 00401284   mov         dword ptr [employee::value (00438494)],0Ah  
  3. 75:       n.value = 100;  
  4. 0040128E   mov         dword ptr [employee::value (00438494)],64h  
静态函数
  1. 00401246   rep stos    dword ptr [edi]  
  2. 70:       employee::print();  
  3. 00401248   call        @ILT+0(employee::print) (00401005)  
不需要this指针(ecx)
7.模板函数
汇编代码表明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是因为可以从入参判断出函数的类型
0 0