2017-10-29 48 views
0

我試着去學習彙編,首先我使用NASM的編譯名稱,但後來我明白,我可以在GCC使用.S文件。這讓我非常感興趣,因爲我的目標是能夠爲自定義語言編寫一個編譯器,所以這非常有趣,因爲它允許我使用c代碼進行鏈接和編譯。如此充滿激情,我開始用gcc編譯c程序集(.s文件),並對它進行了examen。正如我這樣做,它接縫的結構與NASM組裝不同,只有主標籤,f.eks,而不是_start和其他奇怪的結構,並且我不是在談論Intel-與AT語法。所以後來我的問題如下:什麼是結構FO gcc的彙編輸出

它是一個不同的結構,在正常的組裝和在GCC的.s文件中,或者只是我沒有裝配足夠好的knowlage?如果它是不同的結構,它是否有名字?

我一直在想我的方式谷歌這幾個小時,但是當我搜索GCC彙編,和其他的東西我能想到的,我只得到ç內聯彙編...

請幫幫忙,IM因爲沒有弄清楚這一點而變得瘋狂。

+3

除非你使用GCC的'-nostartfiles'選項有發生,因爲該入口點是在_C_啓動運行時代碼沒有'_start'標籤(未在輸出'.s'文件所示)。這種情況下的入口點是'main'和'main'符合CDECL調用約定。 –

+2

您可能正在尋找'as':http://sourceware.org/binutils/docs/as/順便說一下,我認爲如果您打算編寫LLVM IL而不是彙編語言,你自己的編譯器。 – tkausl

+0

即使在NASM中,您也可以編寫符合您的目標平臺ABI的編譯函數,然後您可以將它與C/C++代碼連接在一起,這實際上是如何在應用程序中使用匯編的合理方式之一, ASM中很少有關鍵的小部分,並且大部分都保存在C++中。對於.s文件沒有任何額外的魔力,使它們以某種方式更加可用於鏈接,您可以遵循相同的規則,並在NASM中定義全局標籤。然後可以使用gcc進行鏈接,因爲它會默認添加C運行庫lib(爲您節省一些鏈接器配置的工作)。 – Ped7g

回答

0

GCC發出用於全部的存在於翻譯單元的功能的定義。 (除非它們是static inlinestatic且未使用,或者它選擇將它們內聯到任何地方......)。

CRT啓動文件(缺省情況下由gcc鏈接,每次編譯時不從源重新構建)提供了_start的定義以及您在拆卸二進制文件時將看到的其他函數。他們只是在鏈接階段鏈接的,不作爲編譯.c.s的一部分,這樣你就不會看到他們在gcc -S輸出。

相關:How to remove "noise" from GCC/clang assembly output?上使編譯器ASM輸出人類可讀的提示。