x64传参约定
来源:互联网 发布:手机流程图中文软件 编辑:程序博客网 时间:2024/05/12 09:07
前言
和学长讨论x64函数传参的问题, 用哪几个寄存器传前4个参,记不清了,做个试验.
记录
// Test1230.cpp : Defines the entry point for the console application.//// x64传参约定// x64传参是fastcall调用约定// x64传参时, 参数<=4个时,参数从右往左用寄存器传参// x64传参时, 参数>4个时,参数从右往左前4个参数用寄存器传参, 剩下参数用栈传参(最右面的参数先入栈)// 但是我想不起来用哪4个寄存器传参了, 做个试验.#include "stdafx.h"#include <stdlib.h>#include <stdio.h>void fnTest(int iParam1, int iParam2, int iParam3, int iParam4, int iParam5, int iParam6);int _tmain(int argc, _TCHAR* argv[]){ // 调用 fnTest 之前的反汇编实现 /** 000000013F6C10C0 | 48 89 54 24 10 | mov qword ptr ss:[rsp+10],rdx | test1230.cpp:15 000000013F6C10C5 | 89 4C 24 08 | mov dword ptr ss:[rsp+8],ecx | 000000013F6C10C9 | 57 | push rdi | 000000013F6C10CA | 48 83 EC 30 | sub rsp,30 | 000000013F6C10CE | 48 8B FC | mov rdi,rsp | 000000013F6C10D1 | B9 0C 00 00 00 | mov ecx,C | 000000013F6C10D6 | B8 CC CC CC CC | mov eax,CCCCCCCC | 000000013F6C10DB | F3 AB | rep stosd dword ptr ds:[rdi],eax | 000000013F6C10DD | 8B 4C 24 40 | mov ecx,dword ptr ss:[rsp+40] | 000000013F6C10E1 | C7 44 24 28 06 00 00 00 | mov dword ptr ss:[rsp+28],6 | test1230.cpp:16 000000013F6C10E9 | C7 44 24 20 05 00 00 00 | mov dword ptr ss:[rsp+20],5 | 000000013F6C10F1 | 41 B9 04 00 00 00 | mov r9d,4 | 000000013F6C10F7 | 41 B8 03 00 00 00 | mov r8d,3 | 000000013F6C10FD | BA 02 00 00 00 | mov edx,2 | 000000013F6C1102 | B9 01 00 00 00 | mov ecx,1 | 000000013F6C1107 | E8 F9 FE FF FF | call <test1230.@ILT+0(?fnTest@@YAXHHHHHH@Z)> | */ // 可以看到参数传递过程 // 超过4个参数后, 参数从右往左入栈 // push Param6 // 参数6 // push Param5 // 参数5 // 前4个参数进入寄存器,老手的口头禅, 所谓的 : cd89 // mov r9d, 4 // 参数4 // mov r8d, 3 // 参数3 // mov edx, 2 // 参数2 // mov ecx, 1 // 参数1 // 如果一个函数很复杂, 在release版下不会优化成内联实现, 也符合这种传参约定 fnTest(1, 2, 3, 4, 5, 6); return 0;}// 这函数太简单了, 编译成release版, 内联了.// 用Debug版看吧void fnTest(int iParam1, int iParam2, int iParam3, int iParam4, int iParam5, int iParam6){ printf("iParam1 = %d\r\n", iParam1); printf("iParam2 = %d\r\n", iParam2); printf("iParam3 = %d\r\n", iParam3); printf("iParam4 = %d\r\n", iParam4); printf("iParam5 = %d\r\n", iParam5); printf("iParam6 = %d\r\n", iParam6);}
0 0
- x64传参约定
- X64的调用约定
- x64 调用约定概述
- X64平台调用约定
- x64的调用约定
- x64不同平台的调用约定
- Windows x64汇编函数调用约定
- windows x64函数调用约定(function call convention)
- x64 调用约定,参数传递以及函数返回值
- Windows平台X64函数调用约定与汇编代码分析
- windows x64函数调用约定(function call convention)
- windows x64函数调用约定(function call convention)
- 约定
- 约定
- 约定
- 约定
- 约定
- 约定
- Oracle批量导入100万条数据不到1秒
- (九)模板方法模式详解(包含与类加载器不得不说的故事)
- 前端工作面试问题
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- centos安装postgis
- x64传参约定
- ArcGIS Engine基础开发教程之地图查询
- myBatis中,对">"或者"<"的处理
- 通用IO(二)
- iOS中使用swift语言做淘宝的第三方登录
- 数字天堂HBuilder+MUI(一)websql数据库操作
- python tkinter教程-事件绑定
- Mongodb 3.2 SQL到MongoDB映射表 官方
- 新九九乘法表制作