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

news/2024/10/22 8:22:25/

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

文章目录

  • C语言的Hello World的汇编剖析(64位 Intel架构)
    • 一. 前提准备
    • 二. C转换为汇编操作准备
      • 2.1 创建目录&复制代码
      • 2.2 C文件转换为汇编文件
    • 三. 剖析汇编文件
    • 四. 指令相关
    • 五. 额外记录:指令段相关调用

一. 前提准备

  • 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架构)


http://www.ppmy.cn/news/47795.html

相关文章

DevOps系列文章 - K8S知识体系

环境搭建部分&#xff1a; 1、安装前的准备工作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 查看hostname并修改hostname # 查看本机hostname hostnamectl set-hostname k8s-master # 把本机名设置成k8s-master hostnamectl status # 查看修改结…

精通 Python OpenCV4:第二部分

原文&#xff1a;Mastering OpenCV 4 with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最好真…

【Chano的SFM教程】3dmax 面部表情.VTA基本制作教程

本篇教程作者为&#xff1a;小鸟Chano&#xff0c;转载请表明作者和出处&#xff1a;CSDN 欢迎观看本次教程 本教程将会为你演示使用3D MAX 制作一个基本的SFM表情控制器【表情滑条】并导入SFM进行使用。 Chano自己也是近期才掌握的这项知识&#xff0c;所以过程中可能有很多…

netfilter filter表

iptables是linux下常用的一个防火墙软件&#xff0c;可以实现对网络访问的各种限制。iptables相当于防火墙的客户端&#xff0c;与用户进行交换&#xff0c;其后台依赖于内核的netfilter模块。iptables的各种配置&#xff0c;最终都是netfilter模块来实现的。 iptables分为4个…

李沐读论文笔记--大模型时代下做科研的四个思路

大模型时代下做科研的四个思路 0. 视频来源&#xff1a;1. 提高效率&#xff08;更快更小&#xff09;1.1 PEFT介绍(parameter efficient fine tuning)1.2 作者的方法1.3 AIM效果1.3.1AIM 在 K400 数据集上的表现1.3.2AIM 在 Something-Something 数据集、K700 数据集和 Diving…

Liunx下进程间通信

文章目录 前言1.进程间通信相关介绍2.管道1.匿名管道2.管道的原理3.通过代码来演示匿名管道4.命名管道5.命名管道的原理6.命名管道代码演示 3.System V共享内存1.共享内存原理2.相关系统接口的介绍与共享内存的代码演示3.共享内存的一些特性 4.system V消息队列与system V信号量…

【设计模式】从Mybatis源码中学习到的10种设计模式

文章目录 一、前言二、源码&#xff1a;学设计模式三、类型&#xff1a;创建型模式1. 工厂模式2. 单例模式3. 建造者模式 四、类型&#xff1a;结构型模式1. 适配器模式2. 代理模式3. 组合模式4. 装饰器模式 五、类型&#xff1a;行为型模式1. 模板模式2. 策略模式3. 迭代器模式…

Mysql的简介和选择

文章目录 前言一、为什么要使用数据库 数据库的概念为什么要使用数据库二、程序员为什么要学习数据库三、数据库的选择 主流数据库简介使用MySQL的优势版本选择四、Windows 平台下安装与配置MySQL 启动MySQL 服务控制台登录MySQL命令五、Linux 平台下安装与配置MySQL总结 前言…