汇编与反汇编

程序处理的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.rhkb.cn/news/190590.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端---CSS的样式汇总

文章目录 CSS的样式元素的属性设置字体设置文字的粗细设置文字的颜色文本对齐文本修饰文本缩进行高设置背景背景的颜色背景的图片图片的属性平铺位置大小 圆角矩形 元素的显示模式行内元素和块级元素的转化弹性布局水平方向排列方式:justify-content垂直方向排序方式…

人工智能基础_机器学习023_理解套索回归_认识L1正则---人工智能工作笔记0063

然后上一节我们说了L1,L2正则是为了提高,模型的泛化能力, 提高泛化能力,实际上就是把模型的公式的w,权重值,变小对吧. 然后我们这里首先看第一个L1正则,是怎么做到把w权重变小的 可以看到最上面是线性回归的损失函数,然后 L1可以看到,这个正则,就是在损失函数的基础上给损失…

sqli-labs关卡14(基于post提交的双引号闭合的报错注入)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十四关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不…

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减&#xff0c;注意 最后转为16进制

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程&#xff1a; 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”&#xff0c;或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里&#xff1a; 字符过滤器 首先&a…

Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现&#xff0c;当然现在也是通过signal来实现&#xff0c;只是从go 1.16开始&#xff0c;新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…

win环境Jenkins部署前端项目

今天分享win环境Jenkins部署前端vue项目&#xff0c;使用的版本jenkins版本Jenkins 2.406版本。 前提是jenkins安装好了&#xff0c;通用配置已经配置好了&#xff0c;可以参考上两篇博客。 1、前端项目依赖nodejs&#xff0c;需要安装相关插件 点击进入 安装成功标准 jenki…

通过 Elasticsearch 和 Go 使用混合搜索进行地鼠狩猎

作者&#xff1a;CARLY RICHMOND&#xff0c;LAURENT SAINT-FLIX 就像动物和编程语言一样&#xff0c;搜索也经历了不同实践的演变&#xff0c;很难在其中做出选择。 在本系列的最后一篇博客中&#xff0c;Carly Richmond 和 Laurent Saint-Flix 将关键字搜索和向量搜索结合起…

前端---认识HTML

文章目录 什么是HTML&#xff1f;HTML的读取、运行HTML的标签注释标签标题标签段落标签换行标签格式化标签图片标签a标签表格标签列表标签表单标签form标签input标签文本框单选框复选框普通按钮提交按钮文件选择框 select标签textarea标签特殊标签div标签span标签 什么是HTML&a…

微信公众号制作的资源及网站分享!

微信公众号的出现丰富了我们的网络世界&#xff0c;一篇又一篇的或长或短的文章&#xff0c;让我们碎片化的时间有了去处。而且&#xff0c;我们每个人也可以运营一个微信公众号&#xff0c;人人都可以创建属于自己的微信公众号&#xff0c;无论是记录生活还是分享文章或者想要…

毕业设计项目:基于java+springboot的共享单车信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

同济 MBA 携手和鲸课程共建,以数智人才培养持续赋能企业数字化转型

数智化的浪潮席卷全球&#xff0c;我国产业界应如何做出应变&#xff1f;各企业又该如何深化数字化转型&#xff1f;在任重道远的持续探索中&#xff0c;数智人才培养作为企业实现成功转型的关键要素&#xff0c;已然成为大势所趋。 同济大学综合 MBA 项目高度重视工商管理人才…

Oracle用户密码修改为永不过期

1、查询密码有效时长 select * from dba_profiles where profileDEFAULT and resource_namePASSWORD_LIFE_TIME;没有修改的话 LIMIT 是 180 2、查看用户密码过期时间 select username,account_status,expiry_date,profile from dba_users;3、修改密码为永不过期 alter prof…

【Git企业开发】第六节.配置 Git和标签管理

文章目录 前言一、配置 Git 1.1 忽略特殊文件 1.2 给命令配置别名二、标签管理 2.1 理解标签 2.2 创建标签 2.3 操作标签 总结 前言 一、配置 Git 1.1 忽略特殊文件 在日常开发中&#xff0c;我们有些文件不想或者不应该提交到远端&#xff0c;…

oled显示器程序(IIC)从stm32f103移植到stm32f429出现bug不显示-解决移植失败问题

出现问题处&#xff1a; 刚开始更换了这两行代码&#xff0c;然后更换位置后&#xff0c;oled正常显示&#xff0c;如下为正确顺序 I2C_Configuration();//配置CPU的硬件I2COLED_Init();//OLED初始化 在这段代码中&#xff0c;I2C_Configuration() 函数用于配置CPU的硬件 I2C…

Apache Airflow (五) :DAG调度触发时间

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

使用Inis搭配内网穿透实现Ubuntu上快速搭建博客网站远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

中断处理机制解析

要处理中断&#xff0c;需要有一个中断处理函数。定义如下&#xff1a; irqreturn_t (*irq_handler_t)(int irq, void * dev_id);/*** enum irqreturn* IRQ_NONE interrupt was not from this device or was not handled* IRQ_HANDLED interrupt was handled by this de…

Word转PDF简单示例,分别在windows和centos中完成转换

概述 本篇博客以简单的示例代码分别在Windows和Linux环境下完成Word转PDF的文档转换。 文章提供SpringBoot Vue3的示例代码。 文章为什么要分为Windows和Linux环境&#xff1f; 因为在如下提供的Windows后端示例代码中使用documents4j库做转换&#xff0c;此库需要调用命令行…