我正在使用STM32F4(Cortex-M4)MCU并使用arm-none-eabi-g ++进行编译(我使用的是C ++)。
我要求减少将二进制文件上传到MCU闪存所需的时间。我已经发现我可以通过仅在修改之间上传二进制更改来实现此目的。但是,编译器正在生成一些令人感兴趣的有趣代码。
考虑以下两个程序:
(1)
int main()
{
printf("hello");
return 0
}
(2)
int main()
{
//printf("hello");
return 0
}
通过简单地删除printf
调用,二进制文件就完全不同了。我可以通过使用arm-none-eabi-objdump -D mybinary
反汇编代码来看到这一点。以下是WinMerge中差异的示例:
从图中可以看出,几乎所有函数的stmdaeq
指令都略有不同,我想了解更多相关信息。
这个问题的答案将包括以下内容:
stmdaeq
指令是什么,但为什么它几乎在所有函数的末尾?这是函数的结尾吗?我正在使用GNU Tools for ARM Embedded Processors GCC工具链。
非常感谢您的帮助。
答案 0 :(得分:2)
这不是一条指令,它是代码部分的常量。您可以告诉,因为它正好超过了返回语句,即pop ...,pc
或bx lr
。
它的目的?我能看到的唯一目的是它存储全局变量的地址。最有可能的是,这是一个链接时间常数 - 我。即它由链接器解决,而不是由编译器解决。但它的代码存在于系统函数中(与alloc相关等)。所以你无法摆脱它 - RTL对象文件中存在常量的字节,以及链接器的重定位指令。
它可能是C ++ RTL的工件。尝试切换到C.