x86-64传参规则

i386 和 x86_64 汇编调用C 函数参数传递规则(GCC) 在ubuntu12.04 AMD64 位系统下 阅读详情
  1. 一个参数用rdi(edi)传
  2. 两个参数用rdi、rsi(edi、rsi)传
  3. 三个参数用rdi、rsi、rdx(edi、esi、edx)传
  4. 四个参数用rdi、rsi、rdx、rcx(edi、esi、edx、ecx)传
  5. 五个参数用rdi、rsi、rdx、rcx、r8(edi、esi、edx、ecx、r8)传
  6. 六个参数用rdi、rsi、rdx、rcx、r8、r9(edi、esi、edx、ecx、r8、r9)传

这里用gcc编了一个小程序用来验证传参规则

source


#include<stdio.h>
void fun1(int a)
{}
void fun2(int a,int b)
{}
void fun3(int a,int b,int c)
{}
void fun4(int a,int b,int c,int d)
{}
void fun5(int a,int b,int c,int d,int e)
{}
void fun6(int a,int b,int c,int d,int e,int f)
{}
void main()
{
	int a,b,c,d,e,f;
	a=b=c=d=e=f=2;
	fun1(a);
	fun2(a,b);
	fun3(a,b,c);
	fun4(a,b,c,d);
	fun5(a,b,c,d,e);
	fun6(a,b,c,d,e,f);
}

disassemble



   0x0000555555554696 <+48>:	mov    edi,eax
   0x0000555555554698 <+50>:	call   0x5555555545fa <fun1>//一个参数用edi(rdi)传
   0x000055555555469d <+55>:	mov    edx,DWORD PTR [rbp-0x8]
   0x00005555555546a0 <+58>:	mov    eax,DWORD PTR [rbp-0x4]
   0x00005555555546a3 <+61>:	mov    esi,edx
   0x00005555555546a5 <+63>:	mov    edi,eax
   0x00005555555546a7 <+65>:	call   0x555555554604 <fun2>//两个参数用edi、rsi(rdi、rsi)传
   0x00005555555546ac <+70>:	mov    edx,DWORD PTR [rbp-0xc]
   0x00005555555546af <+73>:	mov    ecx,DWORD PTR [rbp-0x8]
   0x00005555555546b2 <+76>:	mov    eax,DWORD PTR [rbp-0x4]
   0x00005555555546b5 <+79>:	mov    esi,ecx
   0x00005555555546b7 <+81>:	mov    edi,eax
   0x00005555555546b9 <+83>:	call   0x555555554611 <fun3>//三个参数用edi、esi、edx(rdi、rsi、rdx)传
   0x00005555555546be <+88>:	mov    ecx,DWORD PTR [rbp-0x10]
   0x00005555555546c1 <+91>:	mov    edx,DWORD PTR [rbp-0xc]
   0x00005555555546c4 <+94>:	mov    esi,DWORD PTR [rbp-0x8]
   0x00005555555546c7 <+97>:	mov    eax,DWORD PTR [rbp-0x4]
   0x00005555555546ca <+100>:	mov    edi,eax
   0x00005555555546cc <+102>:	call   0x555555554621 <fun4>//四个参数用edi、esi、edx、ecx(rdi、rsi、rdx、rcx)传
   0x00005555555546d1 <+107>:	mov    edi,DWORD PTR [rbp-0x14]
   0x00005555555546d4 <+110>:	mov    ecx,DWORD PTR [rbp-0x10]
   0x00005555555546d7 <+113>:	mov    edx,DWORD PTR [rbp-0xc]
   0x00005555555546da <+116>:	mov    esi,DWORD PTR [rbp-0x8]
   0x00005555555546dd <+119>:	mov    eax,DWORD PTR [rbp-0x4]
   0x00005555555546e0 <+122>:	mov    r8d,edi
   0x00005555555546e3 <+125>:	mov    edi,eax
   0x00005555555546e5 <+127>:	call   0x555555554634 <fun5>//五个参数用edi、esi、edx、ecx、r8(rdi、rsi、rdx、rcx、r8)传
   0x00005555555546ea <+132>:	mov    r8d,DWORD PTR [rbp-0x18]
   0x00005555555546ee <+136>:	mov    edi,DWORD PTR [rbp-0x14]
   0x00005555555546f1 <+139>:	mov    ecx,DWORD PTR [rbp-0x10]
   0x00005555555546f4 <+142>:	mov    edx,DWORD PTR [rbp-0xc]
   0x00005555555546f7 <+145>:	mov    esi,DWORD PTR [rbp-0x8]
   0x00005555555546fa <+148>:	mov    eax,DWORD PTR [rbp-0x4]
   0x00005555555546fd <+151>:	mov    r9d,r8d
   0x0000555555554700 <+154>:	mov    r8d,edi
   0x0000555555554703 <+157>:	mov    edi,eax
   0x0000555555554705 <+159>:	call   0x55555555464b <fun6>//六个参数用edi、esi、edx、ecx、r8、r9(rdi、rsi、rdx、rcx、r8、r9)传

 

x86_64及aarch64架构传参规则 x86_64及aarch64架构下c语言参数传递规则 阅读详情

相关推荐

利用Cesium引擎实现大疆智图B3DM三维模型的高效加载与可视化

本文详细介绍了如何利用Cesium引擎高效加载与可视化大疆智图B3DM三维模型。通过性能优化实战和典型应用场景分析,帮助开发者掌握模型预处理、渲染参数调优及高级功能实现技巧,提升大规模倾斜摄影数据的网页端展示效率。

weixin_29231725的博客 219

arm 饱和指令_8. 从0学ARM-内联汇编、混合汇编、ATPCS规则

一、gcc 内联汇编内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。程序中使用饱和算术运算(Saturating Arithmetic)程序需要对协处理器进行操作在C程序中完成对程序状态寄存器的操作格式:__asm__ __volatile__("asm code" :output :input ...

weixin_36205997的博客 526

各种逻辑漏洞

注册:短信轰炸验证码安全问题密码爆破邮箱轰炸用户任意注册、批量注册用户名枚举XSS(有框的地方就可以尝试插XSS)登录:短信轰炸、验证码安全问题、密码爆破、邮箱轰炸SQL注入撞库抓包把password字段修改为空值发送认证凭证替换、比如返回的数据包中包含账号,修改账号就能登录到其他账号Cookie仿冒修改返回包的相关数据,可能会登陆到其他的用户找回密码:短信邮箱轰炸、短信邮箱劫持重置任意用户账户密码、验证码手机用户未统一验证直接跳过验证步骤。

shirlly_的博客 2093

Intel和ARM GCC程序函数调用的参数传递

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

huang_gao的专栏 1555

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4840

基于FPGA与红外成像的眼动追踪系统设计与实现(教学向)

本文详细介绍了基于FPGA与红外成像的眼动追踪系统设计与实现。通过红外摄像头采集图像,利用FPGA进行实时图像处理和红外瞳孔追踪,结合Verilog编程实现多目标检测与瞳孔定位。该系统适用于嵌入式视觉教学,展示了硬件搭建、算法优化及实时显示的完整流程。

g5h6i7j的博客 823

汇编参数传递

x86 32位程序通过栈传递参数,压栈顺序从右至左 x64 64位程序通过寄存器+栈传递参数,前6个参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9,第7个及以后的参数通过栈传递,压栈顺序从右至左 ...

xiejianjun417的专栏 1473

ubuntu 20.04系统离线安装nfs

ubuntu环境下,离线安装nfs

m0_62464865的博客 2241

X86-64寄存器和栈帧

概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64;正是由于能向后兼容,AMD公司打了一场漂亮翻身战。导致Intel不得不转而生产兼容AMD64的CPU。这是IT行业以弱胜强的经典战役。不过,大家为了名称延续性,更习惯称这种系统结构为x86-64 X86-64在向后兼容的同时,更主要的是注入了

漂飘渔人 1244

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

一文读懂 SAP ICF Services:从 SICF 激活到 ABAP OData V2/V4 安全与实战

本文系统化介绍了ABAP系统中ICF服务的关键概念及实践要点。主要内容包括:ICF服务的核心安全机制,需显式激活才能响应HTTP请求;在SICF中正确激活服务的操作步骤;OData V2/V4服务所需的不同ICF节点配置,如V4统一入口节点/sap/opu/odata4;典型问题如default_host未激活会导致HOST_INACTIVE错误;安全实践包括CSRF防护机制和权限对象(S_ICF_ADM)配置;以及实际案例分析和常见ICF服务节点的功能说明。文章为ABAP开发者与运维人员提供了ICF服务管

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 472

从调用约定到ROP链:x86/ARM/MIPS寄存器传参解析

函数调用在源码层只是参数传递,落到机器层却由ABI与调用约定决定:整数参数优先进入寄存器,浮点参数独立计数,超出部分再落到栈上,并受栈对齐、被调用者保存寄存器、返回值位置等规则约束。理解寄存器传参和栈布局,直接影响逆向分析、调试定位、栈溢出偏移计算与ROP链构造的效率,也决定跨x86_64、ARM64、MIPS平台时能否快速判断参数现场。在CTF练习、固件分析、跨架构调试和利用链编写中,先确认目标架构与ABI,再依据gdb观察寄存器与栈帧,是避免“参数没进栈”和栈对齐崩溃的通用方法。围绕x86、x86_64

weixin_29174013的博客 308

VTK:受约束的 Delaunay 2D用法实战

VTK:受约束的 Delaunay 2D用法实战程序输出程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCellArray.h> #include <vtkDelaunay2D.h> #include <vtkMath.h> #include <vtkMinimalStandardRandomSequence.h> #include <vtkNamedColors.h>

希望我的博客,能帮上你解决学习中工作中所遇到的问题 944

深入理解 32 位寄存器与 64 位寄存器:架构差异与编程实践

在 x86 汇编架构中,32 位寄存器(对应 x86 架构)和 64 位寄存器(对应 x86-64 架构,即 AMD64/Intel 64)的核心区别围绕 位宽扩展、数量增加、访问规则、寻址能力、编程模型 展开

自律即自由 1069

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CTF-PWN入门:32位与64位函数调用约定与栈布局实战解析

函数调用约定是程序底层运行的核心规则,它规定了参数如何在调用者和被调用者之间传递。在32位与64位架构中,这一规则截然不同:x86常用栈传参,参数从右往左压栈;而x64则优先使用寄存器(如rdi、rsi)传递前六个参数,栈仅作为补充。理解这些差异不仅是编译原理的基础,更是漏洞利用与ROP链构造的关键——从ret2libc到栈迁移,每一步都依赖对栈布局和寄存器状态的精确控制。在CTF-PWN实战中,栈溢出攻击常需借助gadget完成参数搬运,而64位的栈对齐规则更是绕过障碍的细节所在。掌握调用约定,才能让任意

weixin_28292761的博客 199

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

函数调用约定与寄存器传参:六大架构反汇编识别指南

函数调用约定(Calling Convention/ABI)决定参数如何通过寄存器传参或栈传递、返回值存放位置以及栈对齐规则。不同架构在参数寄存器数量、栈上参数偏移、浮点参数通道和特殊机制上差异明显,直接影响反汇编时对参数来源与函数签名的判断。掌握这些原理,能减少逆向分析、二进制分析、漏洞排查和内联汇编调试中的偏移误判,也能提升跨平台代码阅读与移植效率。围绕x86-32、x86-64、ARM32、ARM64、MIPS与RISC-V的调用约定差异,结合反汇编识别、调用点交叉验证与gdb动态验证,形成可复现的参

weixin_33502772的博客 285

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言参数传递寄存器详解:x86/ARM调用约定与调试实战

函数调用约定是编译器实现参数传递的底层规则,决定了参数通过哪些寄存器或栈进行传递。不同CPU架构(如x86、x86-64、ARM、ARM64)和操作系统(Linux、Windows)采用不同的调用约定,直接影响汇编混合编程、跨平台移植和性能优化。理解寄存器传参机制,能帮助开发者快速定位参数值异常、可变参数错乱等诡异bug,并在底层开发中写出更高效可靠的代码。本文深入拆解主流架构的参数传递寄存器规则,结合调试案例与实战经验,系统梳理调用约定背后的原理与陷阱。

weixin_32430941的博客 167

系统调用号:程序向操作系统“点单“用的编号

每个系统调用都有一个唯一的编号,通常在操作系统的源代码中定义。系统调用号在不同的操作系统和不同的版本中可能会有所不同。在 Linux 中,系统调用号通常在头文件中定义,或者在相关的系统调用文档中列出。系统调用号是操作系统内核用来标识特定系统调用的唯一标识符。通过系统调用,用户程序可以安全地请求内核执行特权操作。了解系统调用号及其对应的系统调用是编写系统级程序和进行系统编程的基础。当然可以!

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1437

C语言参数传递寄存器规则详解:从x86-64到ARM64的调用约定与调试实践

函数调用约定是ABI的核心组成部分,决定了参数如何通过寄存器与栈进行传递。不同硬件架构下,整数、浮点及指针参数的寄存器分配策略差异显著,直接影响代码性能与跨平台兼容性。理解调用者保存与被调用者保存寄存器的划分,掌握x86-64、ARM64、RISC-V等主流平台的参数传递规则,能够帮助开发者在调试汇编、优化热点函数以及移植代码时快速定位问题。在嵌入式开发与系统级编程中,合理控制参数数量、避免硬编码寄存器依赖,是提升程序可移植性与执行效率的关键实践。

weixin_29722783的博客 62

汇编第一个程序:理解x86-64 ABI与系统调用契约

程序的本质是数据与指令在硬件上的协同执行,其底层运行依赖于操作系统定义的二进制接口(ABI)和CPU特权机制。x86-64架构下,系统调用通过syscall指令触发内核态切换,参数严格按rdi/rsi/rdx等寄存器传递,入口符号_start必须显式声明并符合ELF规范。这种低级契约决定了栈布局、内存段权限(如.text段的AX标志)、退出行为及调试可见性,是GDB单步执行、寄存器观察和strace验证的基础。掌握它,才能真正理解C运行时隐藏的初始化逻辑、内核交互原理与安全机制(如NX bit)。本文以最小

weixin_32430941的博客 301

深入理解x86-64寄存器:从CPU工作原理到汇编实战应用

寄存器是CPU内部的高速存储单元,作为计算机体系结构中的核心概念,其本质是直接集成在处理器核心的晶体管电路,用于在一个时钟周期内完成数据的暂存与运算。理解寄存器的工作原理,是掌握汇编语言、程序优化和系统调试的基础。从技术价值看,寄存器作为软件与硬件交互的最底层接口,直接决定了程序的执行效率,是性能优化的关键所在。在应用场景上,无论是逆向工程中的函数调用分析、高性能计算中的数据驻留优化,还是驱动开发中的设备寄存器配置,都离不开对寄存器的深入理解。本文聚焦于x86-64架构,通过通用寄存器、指令指针和标志寄存器

weixin_30632883的博客 588

x86_64 Linux系统调用ABI全解析:寄存器约定、内联汇编与调试实践

应用程序与操作系统内核之间的每一次交互,都隐藏着一套精密的底层约定。系统调用(syscall)是用户态进入内核态的唯一通道,而系统调用ABI则规定了参数如何传递、返回值如何获取、错误如何识别。在x86_64 Linux平台上,参数通过rdi、rsi、rdx等寄存器依次传递,系统调用号放入rax,执行syscall指令后,返回值同样从rax取回,出错时则返回负的errno值。理解这套寄存器约定,不仅能帮你手写不依赖libc的极简二进制,还能为封装自定义底层接口、排查诡异负数错误、阅读内核源码打下坚实基础。借助

weixin_26800111的博客 235

从单文件到静态库:Linux x86_64汇编模块化与NASM库封装实战

汇编语言常被视为底层优化的利器,但随着代码规模增长,单文件写法会引发命名空间污染、编译效率低下和复用困难等问题。模块化设计通过库的形式将功能隔离,是现代汇编工程的基础。在Linux x86_64平台上,汇编封装库需要理解System V AMD64 ABI,包括前六个整型参数如何通过寄存器传递、callee-saved寄存器的保存义务以及栈16字节对齐规则;同时还要掌握NASM的global指令、静态库打包工具ar和链接器的符号解析机制。静态库既保留了完整的编译链接链路,又能避免共享库带来的PIC复杂度,适

weixin_34245749的博客 269

【汇编学习】

这是从chinaunix迁过来的第一篇文章。

luotuotou的博客 26

深入64位系统编程:从ABI调用约定到缓存优化与向量化加速

在计算机系统编程领域,理解底层硬件与软件的交互原理是构建高性能应用的基础。现代64位计算环境不仅提供了更大的内存地址空间,更在处理器架构、内存管理和指令集层面带来了深刻变革。其技术价值在于,开发者能够基于对ABI(应用程序二进制接口)、缓存一致性协议及向量化指令集等核心机制的掌握,实现极致的性能优化与资源控制。这些知识广泛应用于操作系统、数据库、游戏引擎、高频交易等对延迟和吞吐量要求严苛的场景。本文以GitHub项目sixtyfour-skill为线索,通过分析System V AMD64调用约定、复现伪共

weixin_30940783的博客 362
上一篇: 2018 安恒杯 6 月 pwn - over
下一篇: gdb插件选择
Maxmalloc
博客等级 码龄8年 12粉丝 33原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值