反汇编一个简单的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 %ebp和movl %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,并获取其返回值。leave和ret: 清理栈帧并返回结果。
- 逻辑与
函数 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的结果。
总结:
- 函数
g实现了将传入的参数加2。 - 函数
f调用了g,并传递了从调用者获取的参数。 main函数调用了f,传递参数3,最终将结果加上4。
这个代码的大致逻辑是:main 传递3给 f,f 再传递给 g,g 将3加2并返回5,f 传回5,main 再加4,最后返回9。

浙公网安备 33010602011771号