2011-11-03 81 views
0

我使用GNUARM C編譯器構建遺留代碼,並試圖解析函數的所有隱式聲明。GNU ARM中get_pc()的聲明在哪裏?

我已經遇到了一些ARM特定的功能,並不能找到包含聲明這些函數的頭文件:

get_pc 
get_cpsr 
get_sp 

我已經在網上搜索,並且只提出了包含這些功能的源代碼沒有任何非標準的包含文件。

我也會解決函數聲明。

由於我也將代碼移植到Cygwin/Windows平臺,Cygwin GNU GCC的等效聲明是什麼?

謝謝。

+0

它們是如何使用的?他們有x86等價物(%eip,eflags和%esp),但直接翻譯不太可能產生預期的結果,除非它僅用於調試。 – user786653

+0

它們被用作自檢的一部分。程序將讀取堆棧指針寄存器,並確定堆棧是否溢出。 –

回答

1

你確定這些功能?我對ARM不是很熟悉,但對我來說聽起來像編譯器內在的東西。如果您正在轉向GCC,那麼使用內聯彙編代替它們可能會更好。

+0

或找到匹配的[intrinsic/builtin](http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions) – user786653

+0

'get_pc'函數返回程序計數器變量中的值。同樣適用於get_cpsr(ARM CPSR寄存器)和get_sp(堆棧指針)。 –

+0

但這些是寄存器,而不是變量。您無法直接從C函數訪問寄存器,您需要內聯彙編或編譯器爲您提供一些內置內部函數(有時會在特定於編譯器的頭文件中聲明,有時甚至根本不會聲明)。我沒有看到任何證據表明GCC提供了您需要的內置插件(有一些與ARM相關的內置插件,但沒有您需要的內嵌插件),所以我認爲您需要一些內聯ASM。 – goldfire

3

只寫你自己的,如果你真的需要這些功能,ASM比聯彙編簡單:

.globl get_pc 
get_pc: 
    mov r0,pc 
    bx lr 

.globl get_sp 
get_sp: 
    mov r0,sp 
    bx lr 

.globl get_cpsr 
get_cpsr: 
    mrs r0,cpsr 
    bx lr 
至少在手臂

。如果你正在移植到x86並且需要等價物,我不得不想知道代碼需要什麼東西。特別是你的cpsr可能不得不改變任何使用結果的代碼,因爲處理器供應商/系列中的狀態寄存器幾乎不匹配。 X86等價物應該仍然是大致相同的努力水平,做一個谷歌搜索和閱讀結果比寫代碼(如果你知道處理器)要花費更長的時間。

根據你的應用程序在做什麼,最好只是註釋掉調用這些函數和/或使用返回值的任何代碼。我可以想象爲什麼會使用這些項目的一些原因,但它可能會涉及體系結構特定的東西,而不僅僅是移植一些寄存器讀取功能。那麼user786653問的是關鍵問題。這些功能如何使用?我不能在哪裏找到它們,但它們是如何使用的,爲什麼你認爲你需要它們?

+0

問題不在於編寫這些函數。問題是找到這些函數的聲明來刪除編譯器警告。 –

+0

他們都是32位寄存器,uint32_t get_pc(void)uint32_t get_sp()等應該工作是嗎? –

+2

'get_pc'函數應該有'mov r0,lr'或者它總是會返回'get_pc'函數的地址。此外,請注意,這將返回未針對ARM「管道效應」調整的PC值,OP值可能是也可能不是OP(我不熟悉GNU'get_pc()'內部函數)。 –