c/c++彙編及反彙編命令執行語句
上圖來源於中國MOOK大學南京大學袁春風老師課件,從高階語言到底層二進位制程式碼按此流程一步步進行。
我們首先可以在建立一個c檔案,如果虛擬機器與你的Windows還不可以進行檔案共享,可以開啟Terminal(同windows下的cmd。我的是在/usr/share/Terminal這個路徑。)來編寫一個c檔案。
右鍵open in terminal,則也可以開啟。輸入
touch helloworld.c
vim helloworld.c
i (開始輸入)
esc (退出輸入 )
shift+:(進入命令模式)
wq(儲存並退出)
gcc helloworld.c(編譯c) / g++ helloworld.cpp(編譯cpp)【此時預設輸出檔案在a.out中】
輸入./a.out即可檢視執行結果
預處理命令
$gcc -E hello.c -o hello.i
(預處理去掉以"#"開頭的並展開程式中的巨集定義與標頭檔案,-o後為輸出的與處理的檔名)此時仍未文字檔案
或者$cpp hello.c > hello.i
編譯
編譯過程就是將與處理後的預處理檔案(hello.i)進行詞法分析、語法分析、語義分析、優化後生成彙編程式碼檔案(彙編指令構成)也稱組合語言源程式
進行編譯處理的程式稱為編譯器(compiler)
編譯命令有下面三種方式
$gcc -S hello.i -o hello.i $gcc -S hello.c -o hello.i $/user/lib/gcc/i486-linux-gnu/4.1/cc1 hello.i
經過編譯後的彙編程式碼檔案(hello.s)仍然是可讀檔案,機器仍然無法解釋他,但其屬於機器級語言,是機器指令 (二進位制程式碼)的符號表示
gcc實際上是具體程式(ccp、cc1、as)的包裝命令
彙編
彙編程式用來將組合語言源程式(.s)轉換為機器指令序列(機器語言程式)
$gcc -c hello.s -o hello.o
$gcc -c hello.c -o hello.o
$as hello.s -o hello.o
(as是一個彙編程式
(.o)是一個可重定位目標檔案,包含的是不可讀的檔案程式碼
連結
連結過程將多個可重定位目標檔案(.o)合併生成可執行目標檔案
$gcc -static -o myproc proc1.o proc2.o $ld -static -o myproc proc1.o proc2.o
-static 表示靜態連結 如果不指定-o檔名稱 預設檔名為a.out
反彙編
這篇部落格寫的十分明確可進行學習與參考