我写空的程序惹恼了地狱的计算器编码器,而不是。我只是在探索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