x64参数调用规范

http://kelvinh.github.io/blog/2013/08/05/windows-x64-calling-conventions/

假设传递的参数的个数为n,那么

当n为奇数时,调用者需要分配0x20+8+(n-1)*8的栈空间

其中,0x20=32,用来保存调用者本地变量RCX, RDX, R8, R9,8字节用来保持栈地址16字节对齐,(n-1)*8大小的空间用来保存参数,按照从右向左的顺序,虽然低0x20大小的空间不使用,这部分参数通过RCX, RDX, R8, R9传递,但仍需要调用者为开始的四个参数分配空间。

当n为偶数时,调用者需要分配0x20+(n-1)*8的栈空间

这里,少了8字节,因为参数的个数为偶数,此时无需额外的8字节便可以保持栈地址16字节对齐

原文地址:https://www.cnblogs.com/buaawang/p/9939794.html

时间: 2024-07-28 13:38:27

x64参数调用规范的相关文章

C++学习之虚函数表及调用规范

在支付工具想做社交,即时通讯工具想做app市场,英语字典想做新闻社交的今天,创造这些怪象的公司要求程序员懂得更多几乎是理所当然的,毕竟现在大家什么都想做.这不,正值招聘季,实验室的几位学长也是一直在讨论各种问题,发现对于C++语言而言,问的最多的还是虚函数表和STL. STL的考点至少是实用的,哪怕要求你读过源码,也并不过分,毕竟知根知底才能更好地应用.但要求程序员掌握对象模型着实拎不清,因为这几乎用不到,远没有在设计模式上投入时间实在,或许它们最希望的是拿批发价招语言专家... 我已经近2年没

(struct)结构体变量作为函数参数调用的方法小结

结构体变量.结构指针变量.结构数组作为函数的参数应用实例分析 struct stud { long int num; float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) { t.num=2000101; t.score=71.0; } /*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/ void funar(struct stud t[]) //void funar(stru

js方法作为js参数调用

需求:弹层 问题:需要两种弹层,一种为只弹出消息,另一种是点击确定需要执行js方法. 分析:第一种不考虑,第二种需要用到 js方法作为js参数调用. 代码: function messageLayer(msg,callback){ //弹层调用 alert(msg); if (callback!=undefined){ callback(); } } 调用方法: sweetalert('success',function(){ window.location.href="http://www.c

PHP通过传递对象参数调用asp.net服务测试

asp.net 测试服务 ProcessRequest.asmx文件代码  public class ProcessRequest : System.Web.Services.WebService    { [WebMethod] public Customer RegisterCustomer(Customer customer) { var obj = new Customer(); obj.Name = customer.Name +"_Return"; obj.LastName

执行enable-migrations时,报“使用“2”个参数调用“SetData”时发生异常:“程序集“Microsoft.VisualStudio.TeamArchitect.ModelingProject,..”

今天打开MVC项目(Code-First),打算手动更新数据库,所以直接在"程序包管理控制台"中执行如下命: enable-migrations -contexttypename BJYLOnlineServ.Areas.Enterprise.DAL.EnterpriseContext  -MigrationsDirectory Migrations\Enterprise: 控制台直接给了我一个这样的错误,我奇怪了,之前还好好的啊,怎么回事了.错误: PM> enable-mig

Python基础【day04】:函数介绍、参数调用

本节内容 函数介绍 函数参数及调用 函数的非固定参数 函数介绍 一.介绍 在我们以往的学习编程的过程当中,碰到的最多的两张编程方式或者说编程方法:面向过程和面向对象.其实不管是哪一种,其实都是编程的方法论而已.但是现在有一种更古老的编程方式:函数式编程,以它的不保存的状态,不修改变量等特性,重新进入我们的视野. 面向对象 --->类 ---->class面向过程 --->过程--->def函数式编程-->函数--->def 二.函数定义 我们上初中那会也学过函数,即:y

x86 x64下调用约定浅析

x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C++的默认调用约定,如果不显示声明调用约定的情况下,就是该调用约定.下面我们来从汇编层次来熟悉这种调用约定. 我写了一个函数,如下: 1 int __cdecl TestCdecl(int a, int b, int c, int d, int e) 2 { 3 return a + b + c +

初探x64参数变量及栈空间布局

文章作者:Crack_Qs[4st][PDG] 编译模式:Debug 测试平台:Winodws 7 x64 编译环境:Microsoft Visual Studio Ultimate 2013 (12.0.30723.00) Update 3 关于x64论坛已有其他兄弟分析,我整理下自己的记录.非干货科普文,不喜勿喷. 如果本文中有遗漏部分请参考以下帖子,如果发现错误请反馈给我,万分感谢. x64传参规则研究 http://bbs.chinapyg.com/thread-74565-1-1.ht

讨论printf和cout的参数调用顺序

这里纠正在网络上看到的几个错误,以下给出正确的观点: (1)printf和cout都是有缓冲机制的.(有人认为printf是没有缓冲区的) (2)printf和cout函数对参数的调用顺序在c/c++中是未定义的.(有人认为它们读入的顺序是由右向左,输出顺序是由左到右,类似于栈) 基于以上错误的认识,看下列程序,有人会得到错误的输出的结果. #include <stdio.h> #include <iostream> using namespace std; int main()