[006] [ARM-Cortex-M3/4] 机器码、汇编与反汇编

ARM
Cortex-M3/4
程序处理的4个步骤
编译过程
Keil工程的文件类型
生成反汇编文件
Keil环境
GCC环境
机器码与汇编
LDR伪指令解析
机器码分析

1 程序处理的4个步骤

以led寄存器工程为例,其有两个文件:main.cstart.s,处理过程如下:

在这里插入图片描述

▲ 编译处理过程

1.1 编译过程

  1. 预处理

使用预处理器把源文件main.c经过预处理生成main.i文件,宏定义展开、头文件展开(将所有的#include头文件以及宏定义替换成其真正的内容)、条件编译等,同时将代码中的注释删除,这里并不会检查语法。

  1. 编译

检查语法,使用编译器将预处理文件main.i编译成汇编文件main.s

  1. 汇编

使用汇编器(keil中为armasm)将汇编文件main.s转换成目标文件main.o(二进制文件,即机器码)。

  1. 链接

链接过程使用链接器(keil中为armlink)将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件led.elf(keil中为led.axf)。

使用Detect It Easy软件可以查看可执行文件的基本信息(内存地址、栈大小等) :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9QxXBTz-1646819237138)(img/image-20220309164750089.png)]

▲ Detect It Easy软件查看可执行文件信息

汇编与反汇编概念

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

1.2 Keil工程的文件类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYPvjiPd-1646819237139)(img/image-20220309161347223.png)]

▲ Keil工程的文件类型

2 生成反汇编文件

2.1 Keil环境

在Keil的User选项中,添加以下命令可生成bindis反汇编文件:

fromelf  --bin  --output=led.bin  Objects\led_c.axf				# 生成bin文件
fromelf  --text  -a -c  --output=led.dis  Objects\led_c.axf		# 生成dis反汇编文件

其中,Objects\led_c.axf为编译生成的.axf文件相对于工程文件.uvprojx的位置。

▲ keil生成bin和dis文件

2.2 GCC环境

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

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

即可将可执行程序led.elf反汇编得到led.dis

3 机器码与汇编

3.1 LDR伪指令解析

在工程启动文件start.s中跳转到main函数前加了一条伪指令LDR

; Reset handler
Reset_Handler   PROC
				EXPORT  Reset_Handler             [WEAK]
                IMPORT  main
				LDR SP, =(0x20000000+0x10000#pic_center)
				BL main

通过反汇编来查看编译器最后转换成的实际汇编指令:

▲ 反汇编文件查看伪指令转换结果

实际上将pc+4地址上的数值0x20010000加载到当前地址0x08000088中,此时PC值为:pc+4 = 0x8000090,则pc = 0x800008c,而当前指令地址0x08000088,所以pc = 当前地址+4。

这是因为ARM指令采用流水线机制:当前指令的PC值为下两条指令的地址

  • PC = A +4 (Thumb/Thumb2指令集#pic_center)
  • PC = A + 8 (ARM指令集#pic_center)

CM3中采用Thumb/Thumb2指令集混合编程,即PC = A +4 。

3.2 机器码分析

详见ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition中A8.8.64 LDR(literal)

3.2.1 Thumb/Thumb2指令集

▲ Thumb/Thumb2 LDR指令机器码转换

3.2.2 ARM指令集

▲ ARM LDR指令机器码转换

上面使用的是32位Thumb2 LDR指令,LDR sp,[pc,#4]汇编指令对应的机器码为f8dfd004,转换成二进制为11111 00011011111 1101 000000000100

  • 高16位11111 00011011111与其对应,其中U=1,后四位1111即为PC(R15);
  • 低16位中1101即为Rt,在这里就是SP寄存器(R13),剩下的000000000100为12位立即数,即为此处的#4(0x0100)。

参考资料

END

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
《ARM Cortex-M3与Cortex-M4权威指南》是一本关于ARM Cortex-M3和Cortex-M4处理器的权威性书籍,由Joseph Yiu所著。本书全面介绍了ARM Cortex-M3和Cortex-M4这两种处理器的体系结构、指令集、应用设计实例等内容,是研究这两款处理器的必备手册和高质量参考资料。 本书首先介绍了ARM Cortex-M3和Cortex-M4处理器的体系结构,包括CPU核心、内存、外设接口等方面,并深入解析了这两款处理器的指令集,包括基本指令、数据处理指令、浮点运算指令等。此外,本书还详细介绍了由Cortex-M3和Cortex-M4构成的微控制器的设计,为读者提供了一系列典型的应用示例,使读者能够更好地了解这两款处理器的应用场景和实际应用荣誉。 此外,《ARM Cortex-M3与Cortex-M4权威指南》在讲解ARM Cortex-M3和Cortex-M4的过程中,还介绍了具体的编程技巧和调试方法。对于从事嵌入式系统开发的读者而言,这些内容非常有价值。读者不仅能够学习到ARM Cortex-M3和Cortex-M4的基本知识,还能够掌握相关开发技巧和工具的使用方法。 总之,《ARM Cortex-M3与Cortex-M4权威指南》是一本十分优秀的书籍,为读者提供了全面介绍ARM Cortex-M3和Cortex-M4处理器的基础知识,让读者能够更快地了解这两款处理器的特性和应用场景,并使读者能够根据自己的需求来进行开发和应用。该书值得广大嵌入式开发人员的阅读和借鉴。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值