我最近在ARM平臺上開始了嵌入式編程,在幾個代碼示例中,儘管他們已經使用C語言編寫了該項目,但在代碼之間的某些地方他們調用了自己編寫的某些彙編函數。更令人驚訝的是,他們在組裝函數中所做的全部都是mov smth, smth_else
。由於代碼是由一些專業團隊編寫的,我想知道這樣做的好處是什麼?爲什麼要編寫嵌入式彙編代碼?
UPDATE 在我有限的觀察,我只是認爲,這種做法是無處不在,它並不需要一個例子,但它似乎並非如此。所以這是我提到的例子之一:
/**
* @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
的一部分。不過,我不明白爲什麼會想要branch
使用BX
而不是一個簡單的函數調用或轉到C.
請發佈代碼。 –
除了使用內聯彙編外,您不能通過C調用'mrs'(從系統協處理器寄存器移至ARM寄存器)調用,這就是爲什麼您需要使用匯編。 – auselen