2010-01-31 52 views
0

在Assembly文件中使用#defined'd函數/內聯函數是否有任何限制。在Assembly文件中使用#defined'd函數/內聯函數的限制

我引用了bsd內核,其中定義了兩種不同的實現。 一個是宏等是被定義的asfunction一個正常功能(二者都是相同的功能)

在C文件了splx, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.c

而在h頭文件了splx被定義爲宏, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.h

我的理解是在彙編文件中使用c文件定義,而在包含頭文件的所有其他函數中使用宏定義。

我想我不清楚爲什麼大會在這裏進入圖片。基本上有兩個定義,一個在c文件中,另一個在splx的h文件中。當我剛剛在C語言中註釋掉splx定義時,我在彙編彙編文件時遇到了一些錯誤。(cpu.S)Thatz爲什麼我在編譯彙編文件時使用函數定義(如在c文件中),而宏定義是用於所有其他文件包括h文件。

現在我的問題是:爲什麼不能通過包含頭文件來使用宏定義不能使用宏定義?

+0

您是否找到答案或者您在尋找進一步的幫助? – 2010-02-07 04:33:29

+0

尋找更多幫助 – kumar 2010-02-07 18:34:54

回答

0

在頭文件了splx被定義爲

void splx(int) 
void _setsoftintr(int); 

#if !defined(EVBARM_SPL_NOINLINE) 
#define splx(new) omap_splx(new) 
#define _spllower(ipl) omap_spllower(ipl) 
#define _setsoftintr(si) omap_setsoftintr(si) 
#endif /* !EVBARM_SPL_NOINTR */ 

我不知道爲什麼你指的是裝配文件時,這種語言顯然是C,但我認爲沒有錯與這些聲明 - 了splx是一個函數,但如果定義了EVBARM_SPL_NOINLINE,則該宏將用於將splx的所有用法重新映射到splx_omap。這是預處理器的有效用法,並且不重新定義splx--而是使用一些技巧來修改代碼以使用splx_omap。

這是可行的,因爲預處理器在編譯器之前運行,所以在編譯發生之前,splx的任何發生都將被splx_omap替換。有些人會覺得這很令人不安,但這是預處理器的功能之一,並且非常有用(如果遵守適當的預防措施)。

+0

嗨Sam, 謝謝! 我想我不清楚爲什麼大會在這裏進入圖片。 基本上有兩個定義,一個在c文件中,另一個在這裏用於splx。 (cpu.S) Thatz爲什麼我認爲在編譯程序集文件時使用了函數定義(如在c文件中),所以在編譯程序集文件時會出現一些錯誤,而宏定義用於所有其他文件包括h文件。 現在我的問題是,爲什麼不能使用匯編文件也不能通過包含頭文件來使用宏定義。 – kumar 2010-01-31 11:12:01

+0

如果定義了EVBARM_SPL_NOINLINE,宏定義僅用於強制splx的所有調用者使用splx_omap。 cpu.S的編譯可能沒有定義EVBARM_SPL_NOINLINE,這就是爲什麼當splx在C文件中被註釋掉時出現錯誤的原因。如果您希望cpu.S使用splx_omap,然後定義EVBARM_SPL_NOINLINE或通過編輯所有文件來更新splx的所有調用者以使用splx_omap。這有幫助嗎? – 2010-01-31 11:25:53