C++与汇编
来源:互联网 发布:centos ibus 设置 编辑:程序博客网 时间:2024/05/22 14:59
1.指针
任何指针对汇编而言都是一样的,只不过在操作的时候才有区别
mov byte ptr [eax],2
mov dword ptr [ecx],4019999Ah
2.指针和引用
汇编层是一样的
- 004012FB lea ecx,[ebp-4]
- 004012FE push ecx
- 004012FF call @ILT+50(add_ref) (00401037)
3.类
如果没有虚函数,函数的调用是硬编码
- 65: fruit f;
- 0040132D lea ecx,[ebp-10h]
- 00401330 call @ILT+35(fruit::fruit) (00401028)
- 00401335 mov dword ptr [ebp-4],0
- 66: apple* a = (apple*)&f;
- 0040133C lea eax,[ebp-10h]
- 0040133F mov dword ptr [ebp-14h],eax
- 67: a->print();
- 00401342 mov ecx,dword ptr [ebp-14h]
- 00401345 call @ILT+0(apple::print) (00401005)
- 68: fruit* b = &f;
- 0040134A lea ecx,[ebp-10h]
- 0040134D mov dword ptr [ebp-18h],ecx
- 69: b->print();
- 00401350 mov ecx,dword ptr [ebp-18h]
- 00401353 call @ILT+25(fruit::print) (0040101e)
4.switch,break
int m = 10;
switch(m) -->
- mov eax,dword ptr [ebp-4]
- 004017B2 mov dword ptr [ebp-8],eax 为switch()中的m开辟一段栈内存
{}
break; -->
- break;
- 004017D0 jmp process+4Fh (004017df)
被汇编为一个无条件跳转指令
5.虚函数
在掉用函数时,通过edx被赋予不同的值来实现多态,否则是硬编码
- 76: employee p;
- 0040127D lea ecx,[ebp-10h]
- 00401280 call @ILT+45(employee::employee) (00401032)
- 00401285 mov dword ptr [ebp-4],0
- 77: manager m;
- 0040128C lea ecx,[ebp-14h]
- 0040128F call @ILT+65(manager::manager) (00401046)
- 00401294 mov byte ptr [ebp-4],1
- 78: employee* e = &p;
- 00401298 lea eax,[ebp-10h]
- 0040129B mov dword ptr [ebp-18h],eax
- 79: e->print();
- 0040129E mov ecx,dword ptr [ebp-18h]
- 004012A1 call @ILT+5(employee::print) (0040100a)
- 80: e = &m;
- 004012A6 lea ecx,[ebp-14h]
- 004012A9 mov dword ptr [ebp-18h],ecx
- 81: e->print();
- 004012AC mov ecx,dword ptr [ebp-18h]
- 004012AF call @ILT+5(employee::print) (0040100a)
6.静态变量
就是取同一个地址
- 74: m.value = 10;
- 00401284 mov dword ptr [employee::value (00438494)],0Ah
- 75: n.value = 100;
- 0040128E mov dword ptr [employee::value (00438494)],64h
- 00401246 rep stos dword ptr [edi]
- 70: employee::print();
- 00401248 call @ILT+0(employee::print) (00401005)
汇编代码表明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是因为可以从入参判断出函数的类型
0 0
- 汇编与C....
- 汇编与C配合
- Keil c与汇编
- C语言与汇编
- 汇编与C语言
- 汇编学习-汇编指令与C语言
- 汇编与C/C++内联嵌入汇编
- C与ARM汇编之一
- Intel 汇编与C语言
- C与汇编混合编程
- C与汇编(转)
- c与汇编的关系
- C与汇编混合编程
- 汇编与C融合编程
- C与汇编混合编程
- 汇编与C互操作
- c与汇编混合编程
- c与汇编混合编程
- 总结使人进步,可视化界面GUI应用开发总结:Android、iOS、Web、Swing、Windows开发等
- nyoj 1068 ST【线段树】求和&&奇数个数
- linux安装nginx并设置https(openssl)
- 编解码JSON数据
- 关于提高MYSQL性能的几个经验
- C++与汇编
- composer安装yii2
- LeetCode-Add Two Numbers
- HDU 1754 I Hate It(线段树)
- cf #311 E. Ann and Half-Palindrome (dp+字典树)
- Apache Shiro 快速入门教程,shiro 基础教程
- android学习之路(七)---- 用Fan-Image-Loader实现一个炫酷的相册功能
- C++的namespace
- IOS--最新版SDWebImage的使用