gcc 生成汇编代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhu126fang/article/details/49154789

1. 编译

gcc -S hello.c

生成hello.s文件


2. 查看hello.s 文件


cat hello.s

        .file   "hello.c"
        .section        .rodata
.LC0:
        .string "Hello,World!"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        andl    $-16, %esp
        subl    $16, %esp
        movl    $.LC0, (%esp)
        call    puts
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
        .section        .note.GNU-stack,"",@progbits

急! 关于GCC生成汇编代码

12-04

include rnint fun(b)rnint b;rnrn  printf("%d",b);rn  return(0);rnrnrnrnint main()rnint a=0;rn   fun(a);rn   printf("OK!");rn   return(0);rnrnrnrnrn编译之后的汇编代码:rnrn.file "ex01.c"rn.version "01.01"rngcc2_compiled.:rn.section .rodatarn.LC0:rn.string "%d" //什么意思rn.textrn.align 16 //什么意思rn.globl funrn.type  fun,@function //什么意思rnfun:rnpushl %ebp      rnmovl %esp, %ebp   rnsubl $8, %esp    //为什么在每个调用处都要空出这个空间来,这个空间事实上好像并没有存放任何东西?rnsubl $8, %esp    //问题同上。rnpushl 8(%ebp)rnpushl $.LC0rncall printfrnaddl $16, %esprnmovl $0, %eaxrnmovl %ebp, %esprnpopl %ebprnretrn.Lfe1:rn.size  fun,.Lfe1-funrn.section .rodatarn.LC1:rn.string "OK!"rn.textrn.align 16rn.globl mainrn.type  main,@functionrnmain:rnpushl %ebp    //此处的bp是进入主程序时的bp,那么在进入主程序之前,这个bp保存了什么呢?rnmovl %esp, %ebp  //这一句的意思是说以后的参数都通过bp间接地使用堆栈来存取吗?rnsubl $8, %esp  //为什么主程序这个地方要空出一个空间来?rnmovl $0, -4(%ebp)  //这一句的意思是说保存那个参数a的值到bp-4的单元处吗?rnsubl $12, %esp  //为什么继上面的空出8个单元后,又接着要空出12个单元?作用是什么?rnpushl -4(%ebp)rncall fun     //上面的push压入了参数,但在fun中是如何引用的呢?call时都执行了什么步骤呢?rnaddl $16, %esprnsubl $12, %esp   //问题同上:此处为何也空出这些单元来?rnpushl $.LC1rncall printfrnaddl $16, %esprnmovl $0, %eaxrnmovl %ebp, %esprnpopl %ebprnretrn.Lfe2:rn.size  main,.Lfe2-mainrn.ident "GCC: (GNU) 2.96 20000731 (Mandrake Linux 8.1 2.96-0.62mdk)"rn其中的bp(分两种情况:主程序与子程序)的作用,含义;还有“每次的sub,空出一块空间来”是何用意?再有fun是如何引用参数的。rn期待好心人的点拨rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试