ARM Thumb-2,GCC,代码更改和`stmdaeq`指令

时间:2014-07-09 00:28:42

标签: gcc assembly embedded thumb

我正在使用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中差异的示例:

enter image description here

从图中可以看出,几乎所有函数的stmdaeq指令都略有不同,我想了解更多相关信息。

这个问题的答案将包括以下内容:

  • 我知道stmdaeq指令是什么,但为什么它几乎在所有函数的末尾?这是函数的结尾吗?
  • 我能做些什么(编译器选项或其他方法)以确保次要代码更改(如上面的示例),不会在整个二进制文件中引起此类更改?

我正在使用GNU Tools for ARM Embedded Processors GCC工具链。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这不是一条指令,它是代码部分的常量。您可以告诉,因为它正好超过了返回语句,即pop ...,pcbx lr

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

它可能是C ++ RTL的工件。尝试切换到C.