反汇编一个简单的C程序

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000

实验楼上配套实验一

1.创建main.c文件

touch main.c

vim main.c

2.将main.c文件编译成汇编代码

gcc –S –o main.s main.c -m32

这条命令的含义是:

  • gcc: 调用 GCC 编译器。
  • -S: 只生成汇编代码,不生成可执行文件。
  • -o main.s: 指定输出文件名为 main.s
  • main.c: 输入的 C 源文件。
  • -m32: 生成 32 位架构的代码。

3.查看汇编代码main.s的内容

vim main.s

汇编代码main.s的内容为:



这段代码的含义如下:

函数 g:

  • 从第6行开始定义的函数 g,是一个简单的函数:
    • pushl %ebpmovl %esp, %ebp: 这些指令将栈指针保存到 ebp 寄存器,设置栈帧。
    • movl 8(%ebp), %eax: 读取调用者传递的参数,将其从栈中加载到 eax 寄存器中。8(%ebp) 表示栈中 ebp 寄存器偏移量为8的位置,这是函数的第一个参数。
    • addl $2, %eax: 将寄存器 eax 中的值加2。
    • popl %ebp: 恢复 ebp 的值,撤销栈帧设置。
    • ret: 返回 eax 中的值。

这个函数实际上实现的是一个简单的将输入参数加2并返回的功能。

函数 f:

  • 第24行开始定义的是函数 f,它实现了对函数 g的调用:
    • 逻辑与 g 类似,设置栈帧。
    • movl 8(%ebp), %eax: 从栈中加载参数到 eax 中。
    • movl %eax, (%esp): 将这个参数传递给 g,即将它存入栈中。
    • call g: 调用函数 g,并获取其返回值。
    • leaveret: 清理栈帧并返回结果。

函数 f 的主要作用是接收一个参数并将其传递给 g,再返回 g 的结果。

函数 main:

  • 第45行开始定义的是 main函数:
    • 这个函数传递常量值 $3 给函数 f
    • movl $3, (%esp): 将常量值3压入栈中,作为参数传递给 f
    • call f: 调用函数 f,获取返回值。
    • addl $4, %eax: 这一行的操作是将 f 返回的结果加上4。

因此,main 函数最终返回的是 f(3) 加4的结果。

总结:

  1. 函数 g 实现了将传入的参数加2。
  2. 函数 f 调用了 g,并传递了从调用者获取的参数。
  3. main 函数调用了 f,传递参数3,最终将结果加上4。

这个代码的大致逻辑是:main 传递3给 ff 再传递给 gg 将3加2并返回5,f 传回5,main 再加4,最后返回9。

posted @   zzzxp13  阅读(16)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示