从 C 函数调用 asm 函数时生成错误的 BLX 指令(STM32H753 上的 gcc)

问题描述 投票:0回答:1

上下文是:用arm-none-eabi-gcc编译的STM32H753裸机软件。

复位处理程序用 C 语言实现,位于闪存中:

void reset_handler_c(void)
{
   asm_func();
}

asm 函数在 .s 文件中实现并位于 RAM 中:

.global asm_func

asm_func:
  ldr sp,=xxx
  bl entry_point
  bx lr

(事实上,它没有多大意义,但它显然是一个简化的示例,只是为了重现问题)

生成的asm如下:

问题是:BLX指令只能使用寄存器作为参数并且在执行时会产生硬故障。 STM32H7编程手册摘录:

现在,如果我调用 C 函数,BLX 就会被 BL 替换,这是正确的:

知道为什么 gcc 会生成这个奇怪的 BLX 指令吗?

c assembly gcc stm32
1个回答
0
投票

问题是:BLX指令只能使用寄存器作为参数 并且在执行时会产生硬故障。

我并不感到惊讶,因为你的核心不知道这条指令。

  • BLX label
    存在于ARM生态系统中,但在Cortex-M7内核中不可用。您正在为错误目标进行编译。

如果您想使用正确的 FPU 指令,您需要添加到编译器调用中:

-mthumb -mcpu=cortex-m7
+ 更多内容。

  • 我建议通过使用函数指针来避免单板调用
    void (*fptr)(void) = asm_func;
    fptr();

whih 将仅生成 BLX Rm 指令。

© www.soinside.com 2019 - 2024. All rights reserved.