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

初识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.lryc.cn/news/2384896.html

相关文章:

  • FPGA高效验证工具Solidify 8.0:全面重构图形用户界面
  • SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全
  • java中string类型的list集合放到redis的5种数据类型的那种比较合适呢,可以用StringRedisTemplate实现
  • PyQt学习系列09-应用程序打包与部署
  • 实现图片自动压缩算法,canvas压缩图片方法
  • 《数据结构笔记三》:单链表(创建、插入、遍历、删除、释放内存等核心操作)
  • 光伏行业如何利用SD-WAN优化分布式网络:替代MPLS、VPN、4G/5G的网络架构升级与云安全方案全解析
  • 2025电工杯数学建模A题思路数模AI提示词工程
  • LLM | 论文精读 | NAACL 2025 | Clarify When Necessary:教语言模型何时该“问一句”再答!
  • 嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现
  • MDK的编译过程及文件类型全解
  • socc 19 echash论文部分解读
  • Linux Shell编程(八)
  • AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型
  • 手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)
  • 面试题——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC
  • DETR3D- 3D Object Detection from Multi-view Images via 3D-to-2D Queries
  • SpringBoot3整合WebSocket
  • 鸿蒙进阶——驱动框架UHDF 机制核心源码解读(一)
  • 电子电路:能认为电抗也是在做功吗?
  • DEEPSEEK + 其他工具的玩法
  • Idea 配合 devtools 依赖 实现热部署
  • 远程访问家里的路由器:异地访问内网设备或指定端口网址
  • 根据参数量,如何推断需要多少数据才能够使模型得到充分训练?
  • PycharmFlask 学习心得:路由(3-4)
  • 从逻辑学视角严谨证明数据加密的数学方法与实践
  • 敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系
  • 现代化SQLite的构建之旅——解析开源项目Limbo
  • 本地分支git push 报错 fatal: The current branch XXXX has no upstream branch.
  • 人工智能100问☞第27问:神经网络与贝叶斯网络的关系?