汇编与反汇编

news2024/10/5 14:05:26

程序处理的4个步骤

我们的第一个LED程序涉及两个文件:start.S、main.c,它们的处理过程如下:
在这里插入图片描述

  1. 对于汇编程序,经过汇编之后,转换成目标文件(里面包含机器码)。
  2. 对于C程序,经过预处理之后,得到.i文件,在经过编译后得到汇编文件,汇编文件经过汇编后得到目标文件。
  3. 所有目标文件经过链接之后,生成elf文件(可执行文件),再经过反汇编,得到汇编文件。

我们想深入理解ARM架构,深入理解汇编与C,想深入理解栈的作用,想深入理解C语言的实质,就必须把最终的可执行程序,反汇编后,得到汇编代码。

汇编与反汇编

  • 汇编:汇编文件转换成目标文件(里面是机器码)。
  • 反汇编:可执行文件(目标文件,里面是机器码),转换成汇编文件。

在这里插入图片描述

hex文件、bin文件、axf文件的区别

STM32也是用C语言来开发,也会经过类似的编译过程,只不过我们常常用MDK或者其它IDE来编译,其编译过程如下:
在这里插入图片描述
C文件经过armcc编译器形成目标文件,目标文件再与其他目标文件经过armlink链接器生成映像文件。
汇编代码经过armsm编译器生成目标文件,目标文件目标文件再与其他目标文件经过armlink链接器生成映像文件。

映像文件.axf再经过fromelf格式转换器生成二进制文件、十六进制文件。

在这里插入图片描述
在IDE中进行编译时,我们只需要点击编译按钮即可完成这些过程,编译过程用到的工具(.exe文件)在IDE的安装目录下,比如常用的MDK编译工具路径为:
在这里插入图片描述
在这里插入图片描述
一般这些IDE或者工具集的一些编译工具都放在bin文件夹里。比如MinGW工具集(里面包含gcc/g++编译器,可以编译在电脑上运行的程序)的编译工具所在路径:
在这里插入图片描述
我们的MDK编译时就是使用安装路径下的这些编译工具来完成我们的编译过程。
究其本质,我们在cmd命令窗口也是可以通过命令来编译我们的STM32程序的(前提是配好环境变量,否则得到编译工具所在的路径下进行编译)。
在这里插入图片描述
在cmd窗口下运行armcc命令,会发生什么?
在这里插入图片描述
有些常用的编译选项已经集成在MDK里供我们选择,比如:
在这里插入图片描述
可烧录文件
.axf文件、hex文件与bin文件都是可以运行在我们stm32上的,它们都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。

.axf:包含调试信息
.hex文件:包含地址信息
.bin文件:直接的代码映像

axf文件是编译器默认生成的文件,不仅包含代码数据,还包含着调试信息,在MDK里debug进行调试用的就是这个文件。

.hex文件在MDK里要勾选才可以生成:
在这里插入图片描述
hex文件是一种使用十六进制符号表示的代码记录,记录了代码应该存储到FLASH的哪个地址,下载器可以根据这些信息辅助下载。

bin文件是根据axf文件生成的,需要在MDK下添加类似如下格式命令来生成对应的.bin文件:
在这里插入图片描述
bin文件就是最小的可以运行的文件了,其包含最直接的代码映像。
这三个文件中axf文件最大,hex文件次之,bin文件最小,如:
在这里插入图片描述

KEIL下怎么反汇编

在KEIL的Uer选项中,添加这两项:

fromelf --bin --output=led.bin Objects\led_c.axf
fromelf --text -a -d --output=led.dis Objects\led_c.axf

然后重新编译,即可得到二进制文件led.bin,反汇编文件led.dis。
在这里插入图片描述

GCC反汇编

使用GCC工具链编译程序时,Makefile中有一句:

PREFIX = arm-linux-gnueabihf-
OBJDUMP =$(PREFIX)objdump
$(OBJDUMP) -D -m arm led.elf > led.dis

它就是把可执行程序led.elf反汇编,得到led.dis。

在这里插入图片描述
链接地址 机器码 汇编码
当前PC的值为下一条指令的地址0x0800008C
LDR SR,[PC,#4]
PC再偏移4个字节的地址0x08000090
在这里插入图片描述
把这个地址上的值2000c000存入SP寄存器。

机器码与汇编

伪指令是实际不存在的ARM指令,编译器在编译时转换成存在的ARM指令。
我们代码中的LDR SP, =(0X20000000+0XC000)这条伪指令的真实指令是什么呢?

STM32F103反汇编
在这里插入图片描述

  1. 链接地址
  2. 机器码或数值
  3. 汇编指令或数值

机器码与汇编示例

在这里插入图片描述

解析LDR伪指令

为什么PC=下一条指令+4或者+8呢?

  • CORTEX M3/M4:使用Thumb2指令集,一条指令是16位或32位
  • CORTEX A7:默认使用ARM指令集,一条指令是32位的。
  • ARM指令采用流水线机制:当前执行地址A的指令,同时已经对下一条指令进行译码,同时已经在读取下下条指令:PC=A+4(Thumb/Thumb2),PC=A+8(ARM指令集)

4.5 总结

  • C
    为了方便人类方便使用,发明的高级语言,要转换为汇编。

  • 汇编
    为了解放人类的记忆,发明的“助记符”,不用去记各类机器码。

    最终要转换为机器码。

  • 机器码

    给CPU使用

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

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

相关文章

开源微信万能表单源码系统+自由创建多表单+自定义各行业表单 全开源可二开 带完整的搭建教程

微信作为一个庞大的社交平台,为企业和个人提供了丰富的应用场景。其中,微信公众平台可以为企业提供自定义表单的功能,以满足各种业务需求。然而,在实际应用中,很多企业需要更强大、更灵活的表单系统来处理复杂的业务逻…

C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式

最近在开发的时候,特别是遇到关于跨DLL申请对象、指针、内存等问题的时候遇到了这么一个问题。 问题 跨DLL能不能调用到DLL中提供的单例? 问题比较简单,就是我现在有一个进程A,有DLL B DLL C,这两个DLL都依赖DLL D的…

婴儿专用洗衣机哪个牌子比较好?好用的迷你洗衣机测评

为人父母,是一件非常美妙的事情,在养育新生命的过程中,细心的照顾是非常重要的,而最小的细节,就是让婴儿的衣服保持最温和、最有效的清洁。而婴儿洗衣机是当今不少家庭的福音,它给家长们带来了巨大的方便&a…

Java 并发编程面试题——重入锁 ReentrantLock

目录 1.ReentrantLock 是什么?2.✨什么是重入锁?ReentrantLock 是如何实现可重入特征的?3.公平锁和非公平锁有什么区别?ReentrantLock 分别是如何实现的?4.✨ReentrantLock 的实现原理是什么?5.为什么 Reen…

一文了解Nginx及其基本配置

一、关于Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。 Nginx可以用于处理静态资源、负载均衡、反向代理和缓存等任务。 Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。 Nginx具有低内存消耗、高并发能力和良好的稳定性,因此在互联网领域非常受…

易点易动固定资产管理系统:实现全生命周期闭环式管理和快速盘点

固定资产管理对于企业来说至关重要,它涉及到资产的采购、领用、使用、维护和报废等各个环节。然而,传统的固定资产管理方式往往繁琐、耗时,容易导致信息不准确和资源浪费。为了解决这些问题,我们引入易点易动固定资产管理系统&…

酷开科技智能大屏OS Coolita亮相第134届中国进出口商品交易会

作为中国外贸的“风向标”和“晴雨表”,广交会因其历史长、规模大、商品种类全、到会客商多、成交效果好,被称为“中国第一展”,它见证了中国改革开放的时代大潮与对外贸易的蓬勃发展。 2023年10月15日,第134届中国进出口商品交易…

《012.SpringBoot+vue之在线考试系统》【前后端分离有开发文档】

《012.SpringBootvue之在线考试系统》【前后端分离&有开发文档】 项目简介 [1]本系统涉及到的技术主要如下: 推荐环境配置:idea jdk1.8 maven MySQL 前后端分离; 后台:SpringBootMybatisMySQL; 前台:Vue; [2]功能模块展示&…

泛微E-Mobile 6.0命令执行漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题,在…

B087-人力资源项目-文件上传课程分类

目录 背景控制台操作开通OSS服务创建存储空间 项目工程准备概述新建文件管理模块把文件上传到OSS的三种方案 通过官方文档完成demo上传官方文档找JavaSDK文件上传思路代码 背景 为什么要交给第三方文件管理服务管理? 最传统的的文件管理方案是把文件存储到项目中本…

ADS错误Error警告warning记录持续更新

ADS错误Error警告warning记录持续更新 简介环境1 (smithdg.ael line 7843, column 12 in multiply) Value or parameter is NULL 简介 由于ADS的报错不是很好能找到问题源头,因此记录我在仿真遇到的错误与警告,和其解决办法。 环境 ADS2020 1 (smith…

TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息,明确要传输的数据格式; 应用层协议:这个协议,实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统,驱动,硬件实现好了的,咱们是不需要管 2)应用层:当我…

嵌入式软件开发常用工具有哪些?

分享一些嵌入式软件开发常用工具。 1、Keil MDK:这是德国Keil公司开发的基于8051、9051、ARM7、ARM9系列微控制器的嵌入式软件开发工具,它提供了包括C编译器、宏汇编、连接器、库管理器、仿真器等在内的完整开发方案。Keil还提供了丰富的中间件和库函数&…

AntDB-M高性能设计之hash索引动态rehash

AntDB-M支持hash索引、btree索引等索引类型,hash索引以hash表的方式实现,一个简单的hash表示意图如图1所示。hash桶下的元素节点为单向或者双向链表,数据行上某一个或者某几个字段组成索引,通过hash函数对索引字段的值进行运算&am…

【计网 传输层概述】 中科大郑烇老师笔记 (十)

目录 0 引言1 概述1.1 传输服务和协议1.2 传输层 vs 网络层1.3 Internet传输层协议 TCP和UDP 2 多路复用、解复用2.1 UDP的多路复用2.2 TCP的多路复用 3 UDP3.1 概述3.2 UDP报文段3.3 拓展:TCP报文段 🙋‍♂️ 作者:海码007📜 专栏…

浅谈安科瑞直流电表在加拿大光伏系统中的应用

摘要:本文介绍了安科瑞直流电表DJSF1352在加拿大光伏系统中的应用。主要用于光伏系统中的电流的计量,配合分流器对电流进行计量。 Abstract: This article introduces the application of Acrel DC meters in PV system in Canada.The device is measu…

css:clip元素裁剪实现Loading加载效果边框

clip 属性定义了元素的哪一部分是可见的。clip 属性只适用于 position:absolute 的元素。 警告: 这个属性已被废弃。建议使用 clip-path 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/cliphttps://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path …

振南技术干货集:C语言的一些“骚操作”及其深层理解(2)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 (如何将 35 转为对应的十六进制字符串”0X23”?) 二 、转义符\ (打入字符串内部的“奸细”。) 三、字符串常量的连接 &#xff…

2023年【公路水运工程施工企业安全生产管理人员】复审考试及公路水运工程施工企业安全生产管理人员考试试题

题库来源:安全生产模拟考试一点通公众号小程序 公路水运工程施工企业安全生产管理人员复审考试根据新公路水运工程施工企业安全生产管理人员考试大纲要求,安全生产模拟考试一点通将公路水运工程施工企业安全生产管理人员模拟考试试题进行汇编&#xff0…

asp.net学生部门管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 学生部门管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 asp.net学生部门管理系统1 应用技…