GCC -S選項:生成組合檔案

2020-07-16 10:04:43
編譯器的核心任務是把C程式翻譯成機器的組合語言(assembly language)。組合語言是人類可以閱讀的程式語言,也是相當接近實際機器碼的語言。由此導致每種 CPU 架構都有不同的組合語言。
實際上,GCC 是一個適合多種 CPU 架構的編譯器,不會把C程式語句直接翻譯成目標機器的組合語言,而是在輸入語言和輸出組合語言之間,利用一個中間語言,稱為 RegisterTransfer Language(簡稱 RTL,暫存器傳輸語言)。借助於這個抽象層,在任何背景下,編譯器可以選擇最經濟的方式對給定的操作編碼。

而且,在互動檔案中針對目標機器的抽象描述,為編譯器重新定向到新架構提供了一個結構化的方式。但是,從 GCC 使用者角度來看,我們可以忽略這個中間步驟。
通常情況下,GCC 把組合語言輸出儲存到臨時檔案中,並且在組合器執行完後立刻刪除它們。但是可以使用-S選項,讓編譯程式在生成組合語言輸出之後立刻停止。

如果沒有指定輸出檔名,那麼採用-S選項的 GCC 編譯過程會為每個被編譯的輸入檔案生成以.s作為字尾的組合語言檔案。如下例所示:

$ gcc -S circle.c

編譯器預處理 circle.c,將其翻譯成組合語言,並將結果儲存在 circle.s 檔案中。

如果想把C語言變數的名稱作為組合語言語句中的註釋,可以加上-fverbose-asm選項:

$ gcc -S -fverbose-asm circle.c