我寫空的程序惹惱了地獄的計算器編碼器,而不是。我只是在探索gnu工具鏈。GCC的一個空的程序的彙編輸出在x86,Win32的
現在下面可能對我來說太深了,但爲了繼續空的程序傳奇我已經開始檢查C編譯器的輸出,即GNU消耗的東西。
gcc version 4.4.0 (TDM-1 mingw32)
test.c的:
int main()
{
return 0;
}
的gcc -S test.c的
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl $0, %eax
leave
ret
你能解釋這裏發生了什麼?這是我努力去理解它。我已經使用了as
手動和我最小的x86 ASM知識:
.file "test.c"
是邏輯文件名的指令。.def
:根據文檔「開始定義符號名稱的調試信息」。什麼是符號(函數名稱/變量?)以及哪種調試信息?.scl
:文檔說「存儲類可能會標記符號是靜態的還是外部的」。這是一樣的靜態和外部我知道從C?那'2'是什麼?.type
:將參數「作爲符號表條目的類型屬性」,我沒有線索。.endef
:沒問題。.text
:現在這是有問題的,它似乎是所謂的部分,我已經閱讀它的代碼的地方,但文檔沒有告訴我太多。.globl
「使符號LD可見。」,這個手冊很清楚。_main:
這可能是起始地址爲我的主要功能pushl_
(?):長(32位)推,這使堆movl
上EBP:32位移動。假C:EBP = ESP;
andl
:邏輯AND。假-C:ESP = -16 & ESP
,我真的不明白這是什麼意思。call
:將IP推送到堆棧(所以被調用的過程可以找回它的路),並繼續__main
。 (什麼是__main?)movl
:這個零必須是我在代碼結束時返回的常量。 MOV將這個零置入EAX中。leave
:在ENTER指令(?)後恢復堆棧。爲什麼?ret
:返回到被保存在堆棧
謝謝您的幫助,在指令地址!
好問題。 :) – 2009-08-22 21:39:03
聽起來像是一個真正的極客的優秀練習。 – JesperE 2009-08-22 21:41:12
我找到了COFF規範。這應該提供一些對「.type」中的「32」意味着什麼的引用:http://www.microsoft.com/whdc/system/platform/firmware/PECOFFdwn.mspx – 2009-08-22 21:51:07