【问题标题】:How to force gcc generate thumb 32 bit instructions?如何强制 gcc 生成拇指 32 位指令?
【发布时间】:2017-05-15 08:18:28
【问题描述】:

是否可以在可能的情况下强制生成 thumb 32 位指令?

例如我有:

int main(void) {
 8000280:   b480        push    {r7}
 8000282:   b085        sub sp, #20
 8000284:   af00        add r7, sp, #0
    uint32_t a, b, c;

    a = 1;
 8000286:   2301        movs    r3, #1
 8000288:   60fb        str r3, [r7, #12]
    b = 1;
 800028a:   2301        movs    r3, #1
 800028c:   60bb        str r3, [r7, #8]
    c = a+b;
 800028e:   68fa        ldr r2, [r7, #12]
 8000290:   68bb        ldr r3, [r7, #8]
 8000292:   4413        add r3, r2
 8000294:   607b        str r3, [r7, #4]

    while (1) ;
 8000296:   e7fe        b.n 8000296 <main+0x16>

但它们都是拇指 16 位。出于测试原因,我想要拇指 32 位指令。

【问题讨论】:

  • 我认为 Thumb 的全部意义在于它更喜欢 16 位指令?
  • 可能。但是,我想尽可能生成拇指 32 指令。 (皮质 M4)
  • 我不是这里的专家,我什至没有 ARM 处理器,但 the guidance I find 对我来说似乎很清楚你正在追求一项不可能完成的任务。如果您想发出 32 位指令,只需针对标准 ARM 指令集进行编译。如果这不令人满意,请考虑解释为什么您尝试这样做,也许有人可以为您提供更好的解决方法。
  • 如果您将.w 附加到指令中,它将指示编译器更喜欢 32 位编码。
  • @CodyGray 32 位 ARM 和 thumb2 扩展之间存在很大差异。如前所述,这是针对不支持 32 位 ARM 指令但支持 140 个左右的 thumb2 扩展 (armv7-m) 的 cortex-m4。

标签: gcc arm thumb


【解决方案1】:

嗯,我不认为你可以直接做到这一点,但有一种非常奇怪的方式可以以非常间接的方式实现这一点。就在几天前,我看到一个项目,编译过程不仅仅是一个简单的arm-none-eabi-gcc ... -c file.c -o file.o。该项目正在调用arm-none-eabi-gcc 来生成扩展的程序集列表,随后使用arm-none-eabi-as 手动将其组装到目标文件中。如果您愿意这样做,那么在这两个步骤之间,您可以修改程序集列表以仅包含广泛的说明 - 在大多数(所有?)情况下,您可以使用 sed 在说明中添加 .w 后缀(更改add r3, r2 变成 add.w r3, r2 等等)。这种级别的构建复杂性是否值得,取决于您...

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2018-07-08
    • 2017-01-07
    • 2017-11-08
    相关资源
    最近更新 更多