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

初识main函数

int main(int argc, char *argv[])
{int a = 0;return a;
}

X64

MSVC编译器

Windows x64调用约定

{
// 将第二个参数(rdx)保存到栈[rsp+0x10]位置
0x7ff6e54c2ad0                   mov     qword ptr [rsp+10h],rdx 
// 将第一个参数(ecx)保存到栈[rsp+8]位置
0x7ff6e54c2ad5  <+    5>         mov     dword ptr [rsp+8],ecx
//保存rdi寄存器(非易失性寄存器) 保存rdi是因为函数可能会修改它,遵循调用约定
0x7ff6e54c2ad9  <+    9>         push    rdi
0x7ff6e54c2ada  <+   10>         sub     rsp,10h4        int a = 0;
0x7ff6e54c2ade  <+   14>         mov     dword ptr [rsp],05        return a;
0x7ff6e54c2ae5  <+   21>         mov     eax,dword ptr [rsp]6    
}
// 释放栈空间
0x7ff6e54c2ae8  <+   24>         add     rsp,10h
// 恢复rdi寄存器
0x7ff6e54c2aec  <+   28>         pop     rdi
0x7ff6e54c2aed  <+   29>         ret

GCC/MinGW

System V x64调用约定

        4 [1]	{
0x4016a0                  55                    push   %rbp
0x4016a1  <+    1>        48 89 e5              mov    %rsp,%rbp
0x4016a4  <+    4>        48 83 ec 30           sub    $0x30,%rsp
0x4016a8  <+    8>        89 4d 10              mov    %ecx,0x10(%rbp)
0x4016ab  <+   11>        48 89 55 18           mov    %rdx,0x18(%rbp)
0x4016af  <+   15>        e8 bc 04 00 00        call   0x401b70 <__main>5 [1]	    int a = 0;
//局部变量 a 存储在 -0x4(%rbp)(栈帧内固定偏移)
0x4016b4  <+   20>        c7 45 fc 00 00 00 00  movl   $0x0,-0x4(%rbp)6 [1]	    return a;
0x4016bb  <+   27>        8b 45 fc              mov    -0x4(%rbp),%eax7 [1]	}
0x4016be  <+   30>        48 83 c4 30           add    $0x30,%rsp
0x4016c2  <+   34>        5d                    pop    %rbp
0x4016c3  <+   35>        c3                    ret

对比

特性第一段代码(Windows x64)第二段代码(System V x64)
调用约定Windows x64System V x64(Linux/macOS)
参数传递ecx, rdx, r8, r9rdi, rsi, rdx, rcx, r8, r9
栈帧管理直接调整 rsp
,无 rbp
传统 push rbp
/ mov rbp, rsp
Shadow Space通常 32 字节(此处仅 16 字节)
局部变量存储[rsp]
(栈顶)
-0x4(%rbp)
(栈帧偏移)
非易失寄存器保存显式保存 rdi调用者负责保存
函数返回ret(或 ret 0ret
典型使用场景Windows 程序Linux/macOS 程序
  1. 调用约定差异
    • Windows x64 和 System V x64 在参数传递、栈管理上完全不同。
    • Windows 需要 shadow space,System V 需要栈对齐。
  2. 栈帧管理
    • Windows x64 常省略 rbp,直接操作 rsp
    • System V x64 保留传统栈帧(rbp)。
  3. 寄存器保存
    • Windows x64 可能显式保存非易失寄存器(如 rdi)。
    • System V x64 由调用者保存非易失寄存器。
  4. 代码风格
    • Windows x64 更紧凑(如 [rsp+8] 直接寻址)。
    • System V x64 更传统(如 -0x4(%rbp) 偏移寻址)。
http://www.xdnf.cn/news/604027.html

相关文章:

  • C/C++的OpenCV 进行图像梯度提取
  • [原创](计算机数学)(The Probability Lifesaver)(P14): 推导计算 In(1-u) 约等于 -u
  • 游戏引擎学习第308天:调试循环检测
  • 服务器修改/home的挂载路径
  • 课外活动:大语言模型Claude的技术解析 与 自动化测试框架领域应用实践
  • 【心海资源】【原创开发】TG,飞机,电报,协议号及直登号转API
  • C++滑动门问题(附两种方法)
  • SmartSoftHelp 之 SQL Server 数据库安全备份与安全还原详解---深度优化版:SmartSoftHelp DeepCore XSuite
  • 运维打铁:生产服务器用户权限管理方案全解析
  • leetcode 3068. 最大节点价值之和
  • 阿里开源 CosyVoice2:打造 TTS 文本转语音实战应用
  • 音视频之视频压缩及数字视频基础概念
  • 看海回测系统回测过程
  • CSS 列表样式完全解析:从 ul/ol 基础到自定义样式
  • Kotlin 中该如何安全地处理可空类型?
  • 计算机图形学:(三)MVP变换扩展
  • WPF骨架屏控件(Skeleton)
  • 阿里巴巴Qwen3技术报告深度解析:开源大模型的最新突破
  • ECharts图表工厂,完整代码+思路逻辑
  • PHP实现签名类
  • Pandas:数据分析中的缺失值检测、加载、设置、可视化与处理
  • 苍穹外卖07 缓存菜品缓存套餐 添加购物车
  • 基于大模型预测发育性髋脱位的多维度研究与应用报告
  • c++面向对象基础学习笔记
  • 信号线上加小pf电容、串接电阻以备滤波、阻抗匹配
  • 基于非线性规划的电动汽车充电站最优布局
  • 华为云Astro前端页面数据模型选型及绑定IoTDA物联网数据实施指南
  • 数据结构第1章 (竟成)
  • 2025年渗透测试面试题总结-匿名[社招]安全工程师(红队方向)2(题目+回答)
  • 02-jenkins学习之旅-基础配置