-1

我最近开始在 ARM 平台上进行嵌入式编程,我在几个代码示例中看到,尽管他们用 C 语言编写了项目,但在代码之间的某些地方,他们调用了他们自己编写的一些汇编函数。更令人惊讶的是,他们在该汇编函数中所做的只是mov smth, smth_else. 由于代码是由一些专业团队编写的,我想知道这样做有什么好处?

更新 在我有限的观察中,我只是认为这种做法无处不在,不需要举例,但似乎并非如此。所以这是我提到的例子之一:

 /**
 * @brief  Return the Process Stack Pointer
 *
 * @param  none
 * @return uint32_t ProcessStackPointer
 *
 * Return the actual process stack pointer
 */
uint32_t __get_PSP(void) __attribute__( ( naked ) );
uint32_t __get_PSP(void)
{
  uint32_t result=0;

  __ASM volatile ("MRS %0, psp\n\t" 
                  "MOV r0, %0 \n\t"
                  "BX  lr     \n\t"  : "=r" (result) );
  return(result);
}

这是其中的一部分CMSIS Cortex-M3 Core Peripheral Access Layer Source File。尽管如此,我还是不明白为什么要在 C 中branch使用BX而不是简单的函数调用或 goto。

4

1 回答 1

3

您可能会在项目中看到汇编器的原因有很多——尤其是嵌入式的:

  • 性能:针对特定硬件的特性进行优化。您通常会在编解码器、CPU 密集型 DSP 操作(例如 DFT)、一些 C 标准库函数的实现(例如memcpy)中看到这一点。
  • 达到 C 编译器不能达到的地方:通常是一些非常专业的接近金属的操作系统实现中的情况,例如初始化代码、上下文切换、中断处理程序。同步操作。
于 2013-08-17T11:54:56.457 回答