汇编并分析一段简单C代码

来源:互联网 发布:淘宝开店宝贝上传视频 编辑:程序博客网 时间:2024/06/06 15:44
陈可 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

本文会通过分析一个简单C程序的对应汇编代码来了解C程序是如何被执行的

先写一个简单的C程序:

main.c:

int g(int x){     return x+3;}int f(int x){    return g(x);}int main(void){    int a=5;    return f(a)+1;}
然后反汇编该C程序

这里写图片描述

简单处理main.s
    .file   "main.c"    .text    .globl  g    .type   g, @functiong:.LFB0:    .cfi_startproc    pushl   %ebp    .cfi_def_cfa_offset 8    .cfi_offset 5, -8    movl    %esp, %ebp    .cfi_def_cfa_register 5    movl    8(%ebp), %eax    addl    $3, %eax    popl    %ebp    .cfi_restore 5    .cfi_def_cfa 4, 4    ret    .cfi_endproc.LFE0:    .size   g, .-g    .globl  f    .type   f, @functionf:.LFB1:    .cfi_startproc    pushl   %ebp    .cfi_def_cfa_offset 8    .cfi_offset 5, -8    movl    %esp, %ebp    .cfi_def_cfa_register 5    subl    $4, %esp    movl    8(%ebp), %eax    movl    %eax, (%esp)    call    g    leave    .cfi_restore 5    .cfi_def_cfa 4, 4    ret    .cfi_endproc.LFE1:    .size   f, .-f    .globl  main    .type   main, @functionmain:.LFB2:    .cfi_startproc    pushl   %ebp    .cfi_def_cfa_offset 8    .cfi_offset 5, -8    movl    %esp, %ebp    .cfi_def_cfa_register 5    subl    $20, %esp    movl    $5, -4(%ebp)    movl    -4(%ebp), %eax    movl    %eax, (%esp)    call    f    addl    $1, %eax    leave    .cfi_restore 5    .cfi_def_cfa 4, 4    ret    .cfi_endproc.LFE2:    .size   main, .-main    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"    .section    .note.GNU-stack,"",@progbits

该文件中以.开头的行是为了链接的,在这里只有一个目标模块,所以为了简化分析可以删去
得到:

g:    pushl   %ebp    movl    %esp, %ebp    movl    8(%ebp), %eax    addl    $3, %eax    popl    %ebp    retf:    pushl   %ebp    movl    %esp, %ebp    subl    $4, %esp    movl    8(%ebp), %eax    movl    %eax, (%esp)    call    g    leave    retmain:    pushl   %ebp    movl    %esp, %ebp    subl    $20, %esp    movl    $5, -4(%ebp)    movl    -4(%ebp), %eax    movl    %eax, (%esp)    call    f    addl    $1, %eax    leave    ret
分析代码画出堆栈图:

这里写图片描述

总结:

通过对这段C代码的汇编分析可以发现C语言中的函数是如何在“线性”的汇编上实现的

0 0
原创粉丝点击