首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86,win32上一个空程序的GCC汇编输出

x86,win32上一个空程序的GCC汇编输出
EN

Stack Overflow用户
提问于 2009-08-22 21:28:18
回答 3查看 6.3K关注 0票数 57

我写空洞的程序是为了惹恼该死的stackoverflow程序员,而不是。我只是在探索gnu工具链。

下面的内容对我来说可能太深了,但为了继续空洞的程序传奇,我已经开始检查C编译器的输出,GNU as消耗的东西。

代码语言:javascript
运行
复制
gcc version 4.4.0 (TDM-1 mingw32)

test.c:

代码语言:javascript
运行
复制
int main()
{
    return 0;
}

gcc -S测试.c

代码语言:javascript
运行
复制
    .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:上很清楚这可能是起始地址(?)对于我的主function
  • pushl_:A long (32位)推送,它将EBP放在stack
  • movl:32位移动上。伪C:EBP = ESP;
  • andl:逻辑与。伪C:ESP = -16 & ESP,我真的不明白this.
  • call:将IP推送到堆栈(这样被调用的过程就可以找到返回的方法)并继续__main所在位置的意义。(什么是__main?)
  • movl:?这个零必须是我在代码末尾返回的常量。在回车指令(?)之后,MOV将此零放入EAX.
  • leave:恢复堆栈。Why?
  • ret:返回到保存在堆栈

上的指令地址

感谢您的帮助!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1317081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档