LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1535|回复: 6

关于c程序的汇编代码?

[复制链接]
发表于 2008-3-15 10:50:06 | 显示全部楼层 |阅读模式
有一个简单的c程序,代码如下:
  1. //hello.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.          puts("Hello,Linux!");
  6.          return 0;
  7. }
复制代码
利用gcc的-S选项生成它的汇编代码:
  1. gcc -S -o hello.s hello.c
复制代码
查看生成的汇编代码:
  1.         
  2.          .file   "hello.c"
  3.         .section        .rodata
  4. .LC0:
  5.         .string "Hello,Linux!"
  6.         .text
  7. .globl main
  8.         .type   main, @function
  9. main:
  10.         [color=Red]leal    4(%esp), %ecx   
  11.         andl    $-16, %esp
  12.         pushl   -4(%ecx)[/color]
  13.         pushl   %ebp
  14.         movl    %esp, %ebp
  15.        [color=Red] [color=Blue]pushl   %ecx[/color][/color]
  16.         subl    $4, %esp
  17.         movl    $.LC0, (%esp)
  18.         call    puts
  19.         movl    $0, %eax
  20.         addl    $4, %esp
  21.         popl    %ecx
  22.         popl    %ebp
  23.         leal    -4(%ecx), %esp
  24.         ret
  25.         .size   main, .-main
  26.         .ident  "GCC: (GNU) 4.1.2 20070502 (Red Hat 4.1.2-12)"
  27.         .section        .note.GNU-stack,"",@progbits
复制代码
问题出来了,
1. main函数中的前三条汇编指令(红色颜色部分)是做什么用的?
2. 在建立好堆栈指针之后,为什么要把ecx压入堆栈(蓝色部分),是不是后面的代码有可能改变ecx的内容,所以要保存在堆栈内,还是有其他的原因?
望高手指点。
发表于 2008-3-15 12:55:43 | 显示全部楼层
我不懂,我也想知道答案,帮你顶一下
回复 支持 反对

使用道具 举报

发表于 2008-3-15 14:29:42 | 显示全部楼层
应该是 main函数的参数
main函数的原型应该是 int main(int argc, char *argv[])
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-15 22:44:28 | 显示全部楼层
应该是 main函数的参数
main函数的原型应该是 int main(int argc, char *argv[])

因该不是参数,参数在main函数被调用之前被压入堆栈了。觉得与内存对齐有关,不过没有找到这方面的材料。
回复 支持 反对

使用道具 举报

发表于 2008-3-15 22:50:06 | 显示全部楼层
记得前几天(周/月)本版有人讨论过这个问题, 当时的结论似乎就是对齐, 不过记不清了, 楼主可以翻一翻老帖子
回复 支持 反对

使用道具 举报

发表于 2008-3-17 09:23:34 | 显示全部楼层
我觉的是为了防范栈溢出
回复 支持 反对

使用道具 举报

发表于 2008-3-17 21:05:59 | 显示全部楼层
看最后几行就明白了
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表