總網頁瀏覽量

2016年1月4日 星期一

GCC 初步

簡介:

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






沒有留言:

張貼留言