C语言的Hello World的汇编剖析(64位 Intel架构)

本文介绍了在64位Intel架构上,将C语言的HelloWorld程序转换为汇编代码的过程,并详细剖析了栈空间管理、printf函数调用以及ret指令在返回过程中的作用。文章还探讨了指令段间的调用机制,包括参数传递的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言的Hello World的汇编剖析(64位 Intel架构)

一. 前提准备

  • Linux虚拟机

  • Gcc编译器(若采用Linux虚拟机剖析,则自带无需下载)

  • C语言的Hello World代码

    #include <sudio.h>
    
    int main(){
      printf("Hello World!");
      return 1;
    }
    

二. C转换为汇编操作准备

2.1 创建目录&复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ICWamy6-1681804213620)(C语言的Hello World的汇编剖析.assets/操作1.png)]

2.2 C文件转换为汇编文件

​ 若将C文件转换为汇编文件,则需要编译器作为桥梁,这里使用gcc编译器,由于为只需编译成汇编文件,所以采用—S这个选项命令即可

zhp@root:~$ gcc --help

....
-S     Compile only; do not assemble or link.
....

汇编文件如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oMfO10f4-1681804213620)(C语言的Hello World的汇编剖析.assets/操作2.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKexEwag-1681804213621)(C语言的Hello World的汇编剖析.assets/操作3.png)]

三. 剖析汇编文件

前提概要:

  • b:1字节,8bit
  • w:2字节,16bit
  • l:4字节,32bit
  • q:8字节,64bit

Hello World所经历的步骤剖析:

  1. 栈空间的开辟,使栈基址指向新空间基址,并让栈针sp定位道栈基址bp位置
  2. 并通过Hello World字符串地址值存放edi寄存器
  3. 调用printf函数打印Hello World
  4. 返回值保存寄存器中
  5. 还原bp
  6. 还原栈空间,sp还原

在这里插入图片描述

ps:查看输出Hello World

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kr7LrxsU-1681804213621)(C语言的Hello World的汇编剖析.assets/操作5.png)]

四. 指令相关

ret指令:

  1. 弹出返回地址值并保存到指令地址寄存器
  2. 通过可选项n,从栈中释放参数
  3. 恢复调用过程

下图截至intel手册Volume 3 6.4节
在这里插入图片描述

五. 额外记录:指令段相关调用

就如Hello World的输出

OS正在运行自身程序,突然来了C语言一段代码,调用它
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPlQIRuq-1681804213621)(C语言的Hello World的汇编剖析.assets/image-20230418153040035.png)]


详细步骤分析

  1. 指令段A首先需要调用call命令,来调用指令段B
  2. 这时需要先开辟栈空间等一系列操作,上方已经讲过,不在赘述
  3. 当调用后,需要返回到指令段A继续执行,这时需要用到ret指令
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUn6pB7B-1681804213622)(C语言的Hello World的汇编剖析.assets/image-20230418153853525.png)]

指令段之间的调用,若有参数传递时,则会有2种方式

  1. 一种是存储到一个公共地方,即通用寄存器
  2. 另一种通过栈本身特性,为指令段A的数据开辟一段栈帧,指令段B通过bp的pop/其他方式,来获取数据

第二种方式的操作非常耗时,但也不是抛弃这个方式,由于寄存器数量有限(和计算机的位数相关,如你的计算机是32位,则有32个寄存器),当通用寄存器耗尽时,就可采用此方式。

⭐️更详细的指令间参数调用可参考:指令段间及文件间参数调用过程(64位 Intel架构)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值