0

我正在使用 STM32F4 (Cortex-M4) MCU 并使用 arm-none-eabi-g++ 进行编译(我正在使用 C++)。

我需要减少将二进制文件上传到 MCU 闪存所需的时间。我发现我可以通过仅在修改之间将更改上传到我的二进制文件来做到这一点。然而,编译器正在生成一些有趣的代码,这使得这变得不可能。

考虑以下 2 个程序:

(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 工具链。

您的帮助将不胜感激。

4

1 回答 1

2

它不是指令,它是代码部分中的常量。您可以判断,因为它就在 return 语句之后,即pop ...,pcor bx lr

它的目的?我能看到的唯一目的是它存储了一个全局变量的地址。最有可能的是,它是一个链接时间常数——即它由链接器解析,而不是由编译器解析。但它的代码存在于系统函数中(alloc-related 等)。所以你无法摆脱它 - 常量的字节在 RTL 目标文件中,以及链接器的重定位指令。

它可能是 C++ RTL 的产物。尝试切换到 C。

于 2014-07-09T00:55:30.937 回答