我最近开始在 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。