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

STM32学习【5】底层的知识使用_汇编_反汇编_机器码

目录

  • 写在前面
    • 1. 程序处理的4个步骤
    • 2. KEIL下怎么反汇编
    • 3. GCC下反汇编
    • 4. 机器码与汇编
      • 4.1 STM32F103反汇编
      • 4.2 STM32MP157反汇编
      • 4.3 IMX6ULL反汇编
      • 4.4 机器码与汇编示例
        • 4.4.1 Thumb/Thumb2指令集
        • 4.4.2 ARM指令集
      • 4.5 解析LDR伪指令
      • 4.5 总结

写在前面

对一些底层的知识一定要知道了解清楚的,但是有人就说了,我了解这么多干什么,我都是用的java,C语言等等高级语言,根本涉及不到寄存器之类,其实不然,我们学的所有的技能和知识并不仅仅是表面上的东西,而是学习里面最接近本质的东西,可以用古人的道来形容。
这里面借用了韦东山的一些文字和图片。

1. 程序处理的4个步骤

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

现在只需要理解“汇编”、“反汇编”的概念:

  • 汇编
    汇编文件转换为目标文件(里面是机器码)。
  • 反汇编
    可执行文件(目标文件,里面是机器码),转换为汇编文件。
    在这里插入图片描述

2. KEIL下怎么反汇编

在KEIL的User选项中,如下图添加这两项:

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

注意,上面的led_c需要改成和项目名一样才可以,示例项目是led_c的文件名,其他项目要更改一下,否则会提示找不到。

然后重新编译,即可得到二进制文件led.bin(以后会分析)、反汇编文件led.dis。
如下图操作:

在这里插入图片描述

3. GCC下反汇编

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

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

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

4. 机器码与汇编

参考资料:

doc_and_source_for_mcu_mpu\通用资料\ARM:
    DDI0403E_B_armv7m_arm.pdf  P254  // cortex M3/M4
    ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf  P410  // cortex A7

伪指令:伪指令是实际不存在的ARM命令,编译器在编译时转换成存在的ARM指令。
我们代码中的ldr r1, =0x????????这条伪指令的真实指令是什么呢?
对于我们使用的3款板子,汇编代码如下(如果你的板子不是这3款之一,请灵活变通,知识是一样的):

LDR SP, =(0x20000000+0x10000)   // STM32F103
ldr sp, =(0x80000000+0x100000)  // IMX6ULL
ldr sp, =0xc0000000 + 0x100000  // STM32MP157 A7

我们可以通过反汇编来查看, 只摘取前面一小段。

4.1 STM32F103反汇编

我们只摘取前面一小段,第一列是地址,第二列是机器码,第三列是汇编:

在这里插入图片描述

4.2 STM32MP157反汇编

在这里插入图片描述

4.3 IMX6ULL反汇编

在这里插入图片描述

4.4 机器码与汇编示例

4.4.1 Thumb/Thumb2指令集

在这里插入图片描述

4.4.2 ARM指令集

在这里插入图片描述

4.5 解析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.kler.cn/a/581644.html

相关文章:

  • Python第十七课:卷积神经网络 | 计算机视觉之眼
  • Unknown collation: ‘utf8mb4_0900_ai_ci‘
  • docker安装ollama web ui速度慢解决办法
  • 单调递增数字力扣--738
  • Linux 进程控制:创建、终止、等待与程序替换全解析
  • Vue中子组件可以直接改变父组件的值吗?
  • 在 C# 中,is null 和 == null ‌不完全等价‌
  • TypeScript类:面向对象编程的基石
  • 如何确保 MySQL 数据库的高可用性?
  • 微信小程序面试内容整理-页面的生命周期函数
  • Sass:深度解析与实战应用
  • 使用for循环修改文件名
  • 永磁同步电机矢量控制总结
  • 一学就会的深度学习基础指令及操作步骤(5)使用预训练模型
  • 2025年网络安全决议
  • visual studio 2022中如何指定某个项目为活动项目或启动项目?
  • 常用开源MQ组件对比
  • ✨SQL-递归CTE
  • 【Godot】实现对话系统
  • 自用testAiPlan