06_01_反汇编一个简单的C程序

以下是一段简单C程序

int g(int x)
{
        return x+3;
}

int f(int x)
{
        return g(x);    
}

int main(void)
{
        return f(8) + 1;
}

将C程序编译成汇编代码

编译环境为32位,利用gcc -S -o main.S main.c编译成汇编语言。
注意:64位系统用-m32用32位的工具链去编译,gcc -S -o main.S main.c -m32。

        .file   "main.c"       
        .text
        .globl  g
        .type   g, @function
g:
.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, @function
f:
.LFB1:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        pushl   8(%ebp)
        call    g
        addl    $4, %esp
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE1:
        .size   f, .-f
        .globl  main
        .type   main, @function
main:
.LFB2:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        pushl   $8
        call    f
        addl    $4, %esp
        addl    $1, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE2:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609"
        .section        .note.GNU-stack,"",@progbits                  

上面的代码可以看到以.开头的语句是为了方便链接时的加的标记,实际上不会执行。将其删除后

g:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %eax
        addl    $3, %eax 
        popl    %ebp
        ret
f:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   8(%ebp)
        call    g
        addl    $4, %esp
        leave   
        ret
main:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   $8
        call    f
        addl    $4, %esp     
        addl    $1, %eax
        leave   
        ret

学习视频链接:06_01_反汇编一个简单的C程序.

下一节07_02_C程序和对应的汇编指令(宏指令)将逐条分析汇编代码中之前没见过的指令(宏指令)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值