当前位置: 首页 > news >正文

windows x64位系统函数调用如何传递参数

在 x64 系统(Windows)中,函数调用默认使用一种快速调用(Fastcall)约定。它主要依靠寄存器来传递前几个参数,以提高效率,只有参数过多时才会使用堆栈。

它的核心规则可以概括为一张表:

参数位置参数类型传递使用的寄存器
第1个参数整数/指针RCX
浮点数XMM0
第2个参数整数/指针RDX
浮点数XMM1
第3个参数整数/指针R8
浮点数XMM2
第4个参数整数/指针R9
浮点数XMM3
第5个及以后所有类型堆栈(从右到左压栈)

详细规则与特殊情况

  • 整数与浮点参数的“专车专用”:前四个整数参数和浮点参数使用的是两套完全独立的寄存器,互不干扰。例如,当一个函数的前两个参数是intfloat时,它们会分别使用RCXXMM1寄存器。

  • 大型参数(结构体等)通过引用传递:参数大小不是 1、2、4 或 8 字节,或者本身是__m128类型、数组和字符串时,不会尝试直接放入寄存器,而是在内存中复制一份,然后将指向这份拷贝的指针放入对应的寄存器或堆栈中。这可以理解为“传引用”。

    • 例外:大小恰好是 8、16、32 或 64 位的结构体,会像整数一样,直接按值传递到对应的寄存器中。

  • “影子空间”(Shadow Store):一个很有趣的约定。调用方在堆栈上始终要预留 32 字节(4个寄存器 × 8字节)的空间,即使被调用的函数用不到这么多参数。这主要是为了在需要时,被调用方可以方便地将寄存器参数保存回堆栈,简化了对可变参数(varargs)等复杂情况的支持。

  • 寄存器保存规则:在整个调用过程中,一些寄存器的值需要被被调用方(Callee)保护(即使用前先保存,返回前恢复),如RBX,RBP,RDI,RSI,R12-R15,XMM6-XMM15。而另一些则被认为是易失的(Volatile)调用方(Caller)可以假设它们在函数返回后已被修改,包括用于传参的RCX,RDX,R8,R9,XMM0-XMM5以及RAX,R10,R11等。这保证了函数调用后关键数据不会丢失。

http://www.jsqmd.com/news/1070140/

相关文章:

  • 什么是 Vibe Coding:AI 时代程序员如何从“手写代码”转向“意图驱动开发”
  • 【限时解密】Adobe Firefly 4.2隐藏功能曝光:设计师用它批量生成合规商用素材,平均节省11.7小时/周
  • Python内存管理的终极奥秘:引用计数机制如何实现高效垃圾回收
  • 成都靠谱全屋智能公司大盘点
  • 【求职】找工作如何卡Bug(第四篇):人脉不是你认识谁,而是谁愿意为你背书
  • Windows系统管理革命:从繁琐操作到一键智能的四个效率跃迁
  • Nora音乐播放器:优雅开源的跨平台音乐管理终极方案
  • MarkItDown:如何用一行代码解锁20+文件格式的智能转换能力?
  • PyCryptodome完全指南:Python加密库的终极入门教程
  • 如何用last30days-skill构建数据驱动的商业决策优势
  • AI驱动防伪溯源的技术演进与行业应用
  • 全媒体广告投放的技术架构:从多平台数据打通到效果归因
  • Penpot开源设计工具:从零开始的完整入门指南
  • 如何快速上手图吧工具箱TubaWinUi3:82款硬件检测工具一键启动指南
  • 企业整体搬迁行业难点标准化方案与实操科普
  • 如何用Globe.GL打造惊艳的3D地球数据可视化:从零到一的实战指南
  • 山东大学软件学院项目实训团队博客:基于AI大模型的智能考研助手(七)
  • PDFPatcher深度解析:三大架构创新如何重塑PDF处理体验
  • CBCX:把外汇投教内容建设做到位——要点解读与提示整理
  • MoneyPrinter终极指南:使用本地AI模型自动生成YouTube短视频的完整解决方案
  • Windows系统优化实战:WinUtil一键自动化管理深度解析
  • 多知识库路由:一个入口先选库再检索
  • 从零学会LangChain调用大模型!统一接口+代码实战
  • 2026年,APP依然是用户离不开的使用工具——而ASO,决定了它能否被看见
  • Redis安装指南:单机、主从、哨兵、集群模式详解
  • ABB 控制器 4LA41100102V1.3
  • HarmonyOS ArkUI 自定义跑道布局:CustomMultiChildLayout 模式深度实践
  • 如何用last30days-skill在30秒内完成全网信息调研:AI驱动的市场洞察工具完全指南
  • 如何用Powercalc的查找表策略实现精确到瓦特的智能家居能耗监控
  • Go 语言结构体详解:从定义到高级用法