x86/x64调用约定详解:Visual C++的注册表使用
需积分: 9 45 浏览量
更新于2024-09-10
收藏 246KB PDF 举报
本文档是关于在Windows平台上,C++编程中调用x86和x64汇编语言函数的约定的总结。它详细介绍了哪些寄存器是易变的(volatile)和非易变的(non-volatile),以及它们在函数调用过程中的使用规则。
在x86(32位)环境下,C++调用约定规定了以下寄存器的使用:
- 非易变的(Non-volatile):EBP、EBX、ESI和EDI。被调用的函数必须保留并恢复这些寄存器的内容。
- 易变的(Volatile):EAX、ECX和EDX。这些寄存器可以在函数内部自由使用,无须保存和恢复。
而在x64(64位)环境下,C++的调用约定稍有不同:
- 非易变的(Non-volatile):BP(RBP)、RBX、RSI、RDI以及R12到R15。对于64位程序,函数必须按照64位 prolog 规则来保存和恢复非易变的通用和XMM寄存器。
- 易变的(Volatile):AX(RAX)、RCX、RDX、R8到R11。这些寄存器可以无限制地在函数内部使用。
函数参数和返回值的处理也是调用约定的一部分。在x86上,一般将较小的参数放入EAX、ECX和EDX,较大的参数通过栈传递。返回值通常存储在EAX或EAX和EDX组合中。而在x64,由于有更多的通用寄存器可用,更多的参数可以直接放在寄存器中,返回值通常放在RAX寄存器。
控制标志是指CPU状态的一部分,如条件码,它们可能在函数调用过程中被修改。根据调用约定,函数可以改变这些标志,但需注意可能对后续代码造成的影响。
总结中的表格B-1详列了这些规则,并指出第2章、第4章和第18章提供了更深入的讨论。此外,Visual C++的官方文档也是获取相关信息的重要来源。
在编写涉及跨平台或混合语言编程时,了解并遵循正确的调用约定至关重要,因为它确保了函数调用的正确性和内存一致性。不遵循这些约定可能导致未定义的行为,如数据损坏或程序崩溃。因此,开发者需要理解并适当地应用这些规则,特别是在与底层汇编代码交互时。
2012-09-17 上传
2023-05-31 上传
2023-05-31 上传
2023-07-14 上传
2023-07-14 上传
2023-05-31 上传
2023-07-08 上传
2023-03-25 上传
「已注销」
- 粉丝: 0
- 资源: 2
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦