我写空洞的程序是为了惹恼该死的stackoverflow程序员,而不是。我只是在探索gnu工具链。
下面的内容对我来说可能太深了,但为了继续空洞的程序传奇,我已经开始检查C编译器的输出,GNU as消耗的东西。
gcc version 4.4.0 (TDM-1 mingw32)
test.c:
int main()
{
return 0;
}
gcc -S测试.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"
是逻辑filename..def
:的指令。什么是符号(函数名/变量?)什么类型的调试information?.scl
:文档说“存储类可以标记一个符号是静态的还是外部的”。这和我从C中知道的静态和外部是一样的吗?什么是'2'?.type
:存储参数“作为符号表条目的类型属性”,我没有clue..endef
:没有problem..text
:现在这是有问题的,它似乎是叫做much..globl
的东西,我已经读到它是代码的位置,但文档没有告诉我“使符号对ld可见”,手册在this._main:
上很清楚这可能是起始地址(?)对于我的主functionpushl_
:A long (32位)推送,它将EBP放在stackmovl
:32位移动上。伪C:EBP = ESP;
andl
:逻辑与。伪C:ESP = -16 & ESP
,我真的不明白this.call
:将IP推送到堆栈(这样被调用的过程就可以找到返回的方法)并继续__main
所在位置的意义。(什么是__main?)movl
:?这个零必须是我在代码末尾返回的常量。在回车指令(?)之后,MOV将此零放入EAX.leave
:恢复堆栈。Why?ret
:返回到保存在堆栈上的指令地址
感谢您的帮助!
https://stackoverflow.com/questions/1317081
复制相似问题