簡介:
GCC 是由 GNU 出的 C 語言編譯器,可將由 ANSI C 或 traditional C 言寫
成的程式碼編譯成可執行檔。由於 GCC 能分別編譯出可執行於許多不同硬體、
作業系統下的程式,在 UNIX 系統上是相當多人常用的 C 語言編譯程式。
編譯工作的時候,總共需要4步
1.預處理,生成.i的文件[預處理器cpp]
2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs]
3.有彙編變為目標代碼(機器代碼)生成.o的文件[彙編器as]
4.連接目標代碼,生成可執行程序[鏈接器ld]
-S : 只激活預處理和編譯,就是指把文件編譯成為彙編代碼。
例子用法
gcc -S hello.c
他將生成.s的彙編代碼,你可以用文本編輯器察看
簡單來說,就是產生對應的組合語言檔
-------------------------------------------------------------------------------------
直接編譯 hello.c
在 cmd 執行 gcc -S hello.c
在同一個資料夾就會產生 hello.asm
.file "hello.c"
.ident "GCC: (x86_64-win32-sjlj-rev2, Built by MinGW-W64 project) 4.9.2"
-------------------------------------------------------------------------------------
main(){ }
.file "hello.c"
.def __main; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $32, %rsp
.seh_stackalloc 32
.seh_endprologue
call __main
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-sjlj-rev2, Built by MinGW-W64 project) 4.9.2"
-------------------------------------------------------------------------------------
main(){
int a;
}
同上,應該是因為只有宣告沒有做事, 所以才會一樣. 我猜啦XD
-------------------------------------------------------------------------------------
main(){
int a = 0;
}
所以在給值之後, 組合語言就變了.
.file "hello.c"
.def __main; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $0, -4(%rbp)
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-sjlj-rev2, Built by MinGW-W64 project) 4.9.2"
-------------------------------------------------------------------------------------
http://oss.csie.fju.edu.tw/~neilsun100/program/GCC.pdf
http://a7419.pixnet.net/blog/post/57931682-gcc%E5%8F%83%E6%95%B8%E8%A9%B3%E8%A7%A3
沒有留言:
張貼留言