当前位置: 首页 > article >正文

IMX6ULL裸机-汇编_反汇编_机器码

程序处理的4个步骤

我们编写的C程序是不能直接在ARM等平台上运行的,必须经过一系列的程序处理才可以,我们的第一个LED程序涉及两个文件:start.S、main.c,它们的处理过程如下:

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

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

汇编:将汇编文件(是汇编码)转换成目标文件(里面是机器码)。

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

 

 

 反汇编文件详解

第一列是指令的地址,第二列是机器码,第三列是汇编指令

 

第一条指令,伪指令将这个数据加载到sp寄存器中,在反汇编文件中,使用到了pc,实际上,是keil在链接程序时,在pc+4这个位置保存了这个值,读到该指令时,会把这个数值加载到sp寄存器中,前面是对应这条指令的机器码 f8dfd004

下面这个指令是在A系列上的机器码,可以看到,相似的指令对应的机器码相差很多,这是因为不同系列平台上使用指令集对应的机器码不同,也就是不同架构使用的指令集的机器码可能会不同,同样,查看使用什么样的指令集就可以知道使用什么样的架构

下面是LDR指令对应的机器码 

 

该机器码的二进制机器码 可以看到bit15-bit12对应的是寄存器,经查看对应的是R13,也就是SP寄存器,后面的就是12位立即数  通过机器码看就是4,至于PC,它内部已经设计好不用我们自己设定了

  

那么还有一个问题 可以看到,当前指令的地址是0X08000088,而PC+4对应是0x8000090

ARM的A系列  PC=当前地址+8

 

ARM的M系列 PC=当前地址+4

 

 这里官方给出了解释

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

图解|30张图,带你深入理解CPU流水线和分支预测的那些事儿 - 知乎

PC=当前地址+8,使用了ARM指令集,一条指令是32位,对应的是4,也就是在执行当前指令时,同时在对下一条指令进行译码,同时又在读取下下条的指令, 三级流水线

 


http://www.kler.cn/a/377893.html

相关文章:

  • Unity中有什么情况下是需要用UniTask替代其他异步方式的吗?
  • 【Jenkins】持久化
  • Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 模仿elementui的Table,实现思路
  • 代码随想录D24-25 回溯算法03-04 Python
  • Vue Web开发(十)
  • win10 更新npm 和 node
  • Redis系列---常见问题
  • Hadoop生态圈框架部署(一)- Linux操作系统安装及配置
  • [CARLA系列--01]CARLA 0.9.15 在Windows下的安装教程(一)
  • 系统架构师如何备考-超有用的备考经验(送博主用到的资料)
  • RHCE——DNS域名解析服务器、selinux、防火墙
  • 字符串-05-字符串合并处理
  • 抗疫物资智能管理:SpringBoot技术探索
  • 两数之和笔记
  • redis v6.0.16 安装 基于Ubuntu 22.04
  • (蓝桥杯C/C++)——STL(上)
  • 使用代理和不使用代理request获取host、scheme、url、ip区别
  • FOYA传媒科技招聘
  • 第五项修炼—系统思考
  • 二分查找算法—C++
  • 【机器学习】18. 反向传播 Backpropagation algorithm, 学习率,动量Momenetum, Xavier,梯度消失
  • 实用篇:Postman历史版本下载
  • UI设计公司—兰亭妙微—提供轨道交通行业UI设计
  • mysql5安装
  • Qt6 CMake 中引入 Qt Linguist 翻译功能