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

x64 参数传递

近日某青年似乎研究到x64(AMD64 in history)的参数传递调用约定,这玩意确实和x86上面不一样,于是我决定写点字介绍一下。

x64首先把x86原有的寄存器扩展到了64位,然后更增加了8个通用寄存器:R8~~R15,嗯,确实有点RISC的味道。

  • x64上面默认的函数调用约定是fast call,也就是ABI是fast call。
  • 前四个参数传递顺序是RCX,RDX,R8,R9,其余的参数通过压栈传递。注意这里有一个细节:前四个参数也是占用栈空间的,或者说,栈需要为前四个参数保留32个字节。
  • 小于64位的参数传递时高位并不填充零,大于64位需要按照地址传递。
  • 返回值在RAX
  • 被调用函数不负责清栈
  • RAX,RCX,RDX,R8,R9,R10,R11是“易挥发”的,其余寄存器需要保护。
  • 栈需要16字节对齐。

OK,以上是理论上的东西,实际上编译器会把一切都搞糟,具体可以看一下两篇文章:

The history of calling conventions, part 5: amd64

Although the x64 calling convention reserves spill space for parameters, you don't have to use them as such

这一切看起来非常的令人迷惑,个人推荐的解决办法有三种:

  • 使用ICC或者GCC,这样可以用内联汇编,于是绝大多数问题都解决了。
  • 使用编译器 intrinsics 指令,这玩意好像应该翻译成内省指令,还是内醒,总之不管了,知道是这玩意就行。
  • 手工代码发射,不过这个最好还是用在API hook的时候,写算法真还不如用MASM,不过MASM免不了还得和参数调用约定捉迷藏。

转载于:https://www.cnblogs.com/skogkatt/archive/2011/08/15/4163389.html

相关文章:

  • 《Windows Phone 7 UI设计及人机交互指南》翻译稿
  • [转]获取SQL SERVER表字段详细信息
  • QTCreator 的使用
  • IO的学习笔记 - 同步,异步,阻塞,非阻塞
  • Qt Creator 的 error: collect2: ld returned 1 exit status 问题
  • C++ 类的本质 札记
  • 【转】【翻译】Orx官方教程:4.(anim)动画
  • Android之Providing Resources(提供资源)
  • SAP ECC Web Dynpro ICM Config...
  • 算法之美:排序
  • 基于dedup技术的远程相似文件同步
  • 在Silverlight中对多个异步任务的调用
  • OGC标准介绍 4
  • POJ1991 Turning in Homework——贪心+动态规划——Pku1991
  • 在不影响页面内容的情况下来减少站点的页面输出量、增加页面的访问速度。...
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 03Go 类型总结
  • Android优雅地处理按钮重复点击
  • bearychat的java client
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript创建对象的四种方式
  • java正则表式的使用
  • PV统计优化设计
  • Unix命令
  • Vue2 SSR 的优化之旅
  • Vue2.x学习三:事件处理生命周期钩子
  • zookeeper系列(七)实战分布式命名服务
  • 基于web的全景—— Pannellum小试
  • 记录一下第一次使用npm
  • 离散点最小(凸)包围边界查找
  • 爬虫模拟登陆 SegmentFault
  • 普通函数和构造函数的区别
  • 前端面试总结(at, md)
  • 深入 Nginx 之配置篇
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 正则表达式
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Forward) Music Player: From UI Proposal to Code
  • (python)数据结构---字典
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **PHP分步表单提交思路(分页表单提交)
  • .bat批处理(六):替换字符串中匹配的子串
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core跨平台微服务学习资源
  • .net 反编译_.net反编译的相关问题