LinuxSir.cn,穿越时空的Linuxsir!

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

gcc编译成汇编main函数的问题

[复制链接]
发表于 2007-2-3 19:59:07 | 显示全部楼层 |阅读模式
我有一个代码:


  1. #include <unistd.h>
  2. char* get_str(void)
  3. {
  4.     char str* = {"abcdefghijk"};
  5.     return str;
  6. }

  7. int main(int argc, char* argv[])
  8. {
  9.     char* p = get_str();
  10.     printf("%s\n",p);
  11.     return 0;
  12. }
复制代码


gcc -S a.c之后生成的汇编文件如下

  1.       ……
  2. get_str:
  3.         pushl   %ebp
  4.         movl    %esp, %ebp
  5.         subl    $16, %esp
  6.         movl    .LC0, %eax
  7.         movl    %eax, -12(%ebp)
  8.         movl    .LC0+4, %eax
  9.         movl    %eax, -8(%ebp)
  10.         movl    .LC0+8, %eax
  11.         movl    %eax, -4(%ebp)
  12.         leal    -12(%ebp), %eax
  13.         leave
  14.         ret
  15.         .size   get_str, .-get_str
  16. .globl main
  17.         .type   main, @function
  18. main:
  19.         leal    4(%esp), %ecx
  20.         andl    $-16, %esp
  21.         pushl   -4(%ecx)
  22.         pushl   %ebp
  23.         movl    %esp, %ebp
  24.         pushl   %ecx
  25.         subl    $20, %esp
  26.         call    get_str
  27.         movl    %eax, -8(%ebp)
  28.         movl    -8(%ebp), %eax
  29.         movl    %eax, (%esp)
  30.         call    puts
  31.         movl    $0, %eax
  32.         addl    $20, %esp
  33.         popl    %ecx
  34.         popl    %ebp
  35.         leal    -4(%ecx), %esp
  36.         ret
  37.         .size   main, .-main
  38. ……
复制代码


main函数开头为
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
为何有一个偏移量4呢? esp要和-16与,最后又不用与了呢?
谢谢
发表于 2007-2-5 12:49:32 | 显示全部楼层
与-16,是为了16字节对齐。
回复 支持 反对

使用道具 举报

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

本版积分规则

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