2011-07-02 42 views
1

如何將Ada程序代碼和程序集(使用GAS組裝)混合?將ada與程序集混合

我知道如何鏈接Ada與C,但我怎麼可以鏈接程序集?我知道gcc從Ada代碼生成彙編代碼,正因爲如此,我認爲可以做這個交叉鏈接。

+2

也許這會幫助嗎? http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Inline-Assembler.html –

回答

2

大概你會將程序集編譯成一個.o目標文件,並將其作爲參數提供給你的Ada編譯器。

+1

也必須匹配調用和命名約定。 –

+0

但我怎樣才能使用這兩個代碼? 例如,我在程序集中編寫兩個數字的總和,Ada中的程序將發送彙編代碼和彙編代碼的數字,以返回所添加的值。 – Alexandre

+0

@Alexandre我希望這不會進入任何人使用的應用程序。除了教育自己之外,我不希望任何人在ADA項目中編寫程序集。對於像添加這樣的簡單問題,請使用內聯彙編器。但要意識到,如果你不知道自己在做什麼,那麼你可以打破一切。 http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Inlining-Inline-Assembler-Code.html#Inlining-Inline-Assembler-Code – whoplisp

2

我該如何處理這兩個代碼?

如果您在Intel x86上使用GNATInline Assembler包含相關示例。

附錄-S選項允許一個「檢查生成的彙編代碼」。這適用於Ada,C,C++等。

+0

嗨,但是,如果我需要使用單獨的文件,特定文件的程序集和特定的文件爲Ada代碼,鏈接混合C與C++。 – Alexandre

+2

是的,正如@whoplisp所述。 AFAIK,鏈接器不知道(或關心)'.o'是如何產生的。使用'-S'選項查看已編譯源的中間程序集列表。 – trashgod

1

如果要使用Ada執行任何類型的混合語言編程(包括Ada/Assember),則應該查看編譯器的文檔Interfacing pragmas,特別是其允許的調用約定。

例如,Gnat provides an Assembler convention對於pragma import/export

一般來說,您必須將您的彙編程序設計爲一個子程序,該子程序使用與您的接口編譯指示中使用的「約定」兼容的調用約定。

大多數編譯器還通過System.Machine_Code包支持某種內聯彙編。這使您可以將相同源文件中的少量彙編語言與Ada混合使用。