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

news2024/12/23 22:29:17

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
  • l:2字节,16bit
  • w:4字节,32bit
  • r:8字节,64bit

Hello World所经历的步骤剖析:

  1. 栈空间的开辟,使栈基址指向新空间基址,并让栈针sp定位道栈基址bp位置
  2. 并通过Hello World拷贝到edi寄存器(这里涉及到寄存器字符串拷贝相关操作)
  3. 调用printf函数打印Hello World
  4. 返回值保存寄存器中
  5. 还原bp
  6. 还原栈空间,sp还原

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

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个寄存器),当通用寄存器耗尽时,就可采用此方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TenserRT(三)PYTORCH 转 ONNX 详解

第三章&#xff1a;PyTorch 转 ONNX 详解 — mmdeploy 0.12.0 文档 torch.onnx — PyTorch 2.0 documentation torch.onnx.export 细解 计算图导出方法 TorchScript是一种序列化和优化PyTorch模型的格式&#xff0c;将torch.nn.Module模型转换为TorchScript的torch.jit.Scr…

ERTEC200P-2 PROFINET设备完全开发手册(6-1)

6 报警和诊断 Profinet提供了强大的诊断功能&#xff0c;这是其他通讯协议所无法比拟的。PN设备检测到问题后可以向控制器发送报警信息&#xff0c;报警分为三大类&#xff1a; 诊断报警 &#xff08;PN设备本身故障触发的报警&#xff0c;例如&#xff1a;温度测量通道变送电…

Activiti学习02

这里写目录标题一、流对象简介1.1 事件1.2 活动1.3 条件二、Activiti系统服务结构图核心类:服务类:RepositoryServiceRuntimeServiceTaskServiceHistoryServiceFormServiceIdentityServiceManagementService三、Activiti数据库支持一、流对象简介 一个业务流程图有三个流对象的…

ATFX国际:中国一季度GDP同比增长4.5%,社消总额约11.5万亿元

ATFX国际&#xff1a;中国统计局发布一季度国民经济运行报告&#xff0c;其中值得关注两大数据分别为GDP同比增速、社会消费品零售总额增速。统计显示&#xff0c;一季度GDP总额28.5万亿元&#xff0c;同比增长4.5%&#xff0c;其中第一产业和第二产业的增速低于平均值&#xf…

Pyqt案例讲解(实现模拟计算器效果)

PyQt5是一个用于Python的GUI框架&#xff0c;它提供了一个简单易用的GUI工具包&#xff0c;可以用于创建各种类型的应用程序&#xff0c;包括计算器。下面是一个简单的计算器的实现&#xff0c;其中包括了一些难点和复杂的地方。 难点&#xff1a; 使用Qt的布局管理器来创建窗…

证书扫描件怎么弄?手机也能轻松扫描

现代社会中&#xff0c;证书是人们展示自己能力和经历的重要凭证。然而&#xff0c;我们有时需要将证书扫描并保存在电脑或手机中&#xff0c;以备不时之需。本文将介绍如何扫描证书以及手机上是否能进行扫描。 证书扫描的方法 将证书扫描成电子文档可以方便地将其存储在电脑或…

C++ Primer 第7章 类 - 中(零基础学习C++,精简学习笔记)

&#x1f916; 作者简介&#xff1a;努力的clz &#xff0c;一个努力编程的菜鸟 &#x1f423;&#x1f424;&#x1f425; &#x1f440; 文章专栏&#xff1a;C Primer 学习笔记 &#x1f4d4;专栏简介&#xff1a; 本专栏是博主学习 C Primer 的学习笔记&#xff0c;因为…

技巧:WIN10手动指定某个应用程序使用独立显卡

目录1. 背景2. 解决方法&#xff0c;假如要让剪映始终使用独立显卡2.1 步骤1&#xff0c;右击电脑桌面空白处&#xff0c;选择“显示设置”2.2 步骤2&#xff0c;拉到最下面&#xff0c;点击图形设置2.3 步骤3&#xff0c;选择桌面应用&#xff0c;点击浏览2.4 步骤4&#xff0…

领课在线教育系统源码 各行业都适用的分布式在线教育系统+支持讲师入驻功能

领课教育系统&#xff08;roncoo-education&#xff09;是基于领课网络多年的在线教育平台开发和运营经验打造出来的产品&#xff0c;致力于打造一个各行业都适用的分布式在线教育系统。系统采用前后端分离模式&#xff0c;前台采用vue.js为核心框架&#xff0c;后台采用Spring…

bash shell 无法使用 perl 正则

1.案例现象 前几天有一个小伙伴在群里求助&#xff0c;说他这个 shell 脚本有问题&#xff0c;让大家帮忙看看 #!/bin/bash regularExpression"^\[(\d)\].$" contentcat $1 for i in ${content} doif [[ $i ~ $regularExpression ]]thenecho -e "\033[32m 【 i…

一款多参数多合一的空气质量传感器【温湿度、TVOC甲醛CO2粉尘等】

档案馆库房专用的一款智能型空气质量云测仪 空气质量检测仪 空气质量传感器 环境集成传感器 集成/温湿度、粉尘PM2.5 PM10/甲醛/TVOC/CO2等高度集成的一款传感器/RS485信号输出 ◆温度测量参数: (1)温度测量范围: -40~80℃(2&#xff09;输出分辨率:0.1oC (3&#xff09;…

从零开始学架构——高性能负载均衡

高性能负载均衡 单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单——通过增加更多的服务器来提升系…

Pandas入门实践1 -初探

我们将开始介绍Series、DataFrame和Index类&#xff0c;它们是pandas的基本构建块&#xff0c;并展示如何使用它们。在本节结束时&#xff0c;您将能够创建DataFrame并对它们执行操作以检查和筛选数据。 DataFrame剖析 DataFrame由一个或多个Series组成。Series的名称构成列名…

( “树” 之 DFS) 111. 二叉树的最小深度 ——【Leetcode每日一题】

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2…

matplotlib 笔记:subplot之间间距拉开

0 前情介绍 使用matplotlib的subplot时&#xff0c;由于默认间距不大&#xff0c;所以可能导致出的图会挤在一起 import matplotlib.pyplot as pltplt.subplot(221) plt.plot([1, 2, 3])plt.subplot(222) plt.bar([1, 2, 3], [4, 5, 6])plt.xlabel(xlabel, fontsize15, color…

码云私有仓库+宝塔面板部署WebHooks实现代码同步

权限问题&#xff0c;要分清楚两个帐号的权限www和root sudo -u www ssh -T gitgitee.com sudo -u root ssh -T gitgitee.com看清楚是用那个&#xff0c;建议用WWW帐号权限&#xff0c;不能用ROOT权限(最高权限不建议) 所以生成SSH是要注意要用那个帐号来生成&#xff1a; 一…

关于yolov7的一些理解

论文: https://arxiv.org/abs/2207.02696 Github: https://github.com/WongKinYiu/yolov7 YOLOV7的一些理解 1.摘要2.创新点3.具体工作3.1.网络结构优化3.2.辅助头训练3.3.标签分配策略3.4.重参数结构3.5.其它 1.摘要 Yolov7是Yolov4团队的作品&#xff0c;受到了yolo原作者…

Vue3瀑布流(Waterfall)

Vue2瀑布流&#xff08;Waterfall&#xff09; 可自定义设置以下属性&#xff1a; 图片数组&#xff08;images&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, src: string}>&#xff0c;默认 [] 要划分的列数&#xff08;columnCount&#xff09;&a…

Linux下_多线程

线程 1. 为什么使用线程? 使用fork创建进程以执行新的任务&#xff0c;该方式的代价很高。多个进程间不会直接共享内存线程是进程的基本执行单元&#xff0c;一个进程的所有任务都在线程中执行&#xff0c;进程要想执行任务&#xff0c;必须得有线程&#xff0c;进程至少要有一…

11、响应数据

文章目录1、响应JSON1.1、引入开发场景1.2 、jackson.jar ResponseBody1、装填返回值处理器2、返回值初步处理3、获取并使用返回值处理器4、观察如何获取返回值处理器5、返回值处理器接口内部6、返回值处理器支持的类型7、返回值解析器原理1.3、HTTPMessageConverter 原理1、M…