2013-08-17 105 views
-1

我最近在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.

+4

請發佈代碼。 –

+1

除了使用內聯彙編外,您不能通過C調用'mrs'(從系統協處理器寄存器移至ARM寄存器)調用,這就是爲什麼您需要使用匯編。 – auselen

回答

3

有幾個明顯的原因,爲什麼你可能會看到一個項目中的彙編 - 特別是一個嵌入式:

  • 性能:針對特定硬件的功能進行優化。您通常會在編解碼器,CPU密集型DSP操作(例如DFT)以及某些C標準庫函數(例如memcpy)的實現中看到這一點。
  • 達到C編譯器無法達到的位置:在操作系統的實現中,通常有一些非常專業的金屬密切的情況,比如初始化代碼,上下文切換,中斷處理程序。同步操作。
+0

雖然如果嵌入式架構支持SIMD,VLIW和其他奇特的東西,但您不需要ASM的性能,但是它並不是在任何地方都可用,即使它們是可用的,由於編譯器的缺陷仍然可能有一些地方需要優化因爲我們不住在理想的世界裏。 :) – lpapp

+0

@LaszloPapp如果有的話,SIMD單元比常規處理器更不適合優化,因爲有些操作不能用C或C++簡單地表達。 DSP操作和編解碼器的手工編碼實現相當普遍。 – marko

+0

您錯過了不可避免地使用通常包裝在標準庫中的組裝系統調用。在'svc'的臂膀世界裏(監督電話)。 – auselen