大家好,欢迎来到IT知识分享网。
程序处理的4个步骤
- 对于汇编程序,经过汇编之后,转换成目标文件(里面包含机器码)。
- 对于C程序,经过预处理之后,得到.i文件,在经过编译后得到汇编文件,汇编文件经过汇编后得到目标文件。
- 所有目标文件经过链接之后,生成elf文件(可执行文件),再经过反汇编,得到汇编文件。
我们想深入理解ARM架构,深入理解汇编与C,想深入理解栈的作用,想深入理解C语言的实质,就必须把最终的可执行程序,反汇编后,得到汇编代码。
汇编与反汇编
- 汇编:汇编文件转换成目标文件(里面是机器码)。
- 反汇编:可执行文件(目标文件,里面是机器码),转换成汇编文件。
hex文件、bin文件、axf文件的区别
映像文件.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进行调试用的就是这个文件。
KEIL下怎么反汇编
在KEIL的Uer选项中,添加这两项:
fromelf --bin --output=led.bin Objects\led_c.axf fromelf --text -a -d --output=led.dis Objects\led_c.axf
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寄存器。
机器码与汇编
STM32F103反汇编
- 链接地址
- 机器码或数值
- 汇编指令或数值
机器码与汇编示例
解析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使用
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134321.html