实验:反汇编一个简单的C程序
1.首先创建main.c文件,并且按照实验楼要求编写c程序
这里的参数按照学号修改
2.对所生成的main.c进行编译,得到main.s文件
删除多余代码得到下面纯净的汇编代码
3.汇编语句分析
首先分析最先执行的main代码:
pushl %ebp 把EBP寄存器也即栈基指针的值压栈
movl %esp,%ebp 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针
subl $4,%esp 栈顶指针下以4个单位,分配一个单元
movl $28, (%esp) 将数值28存储到刚刚分配的个单元
call f 调用f函数
add $4,%eax 将数值4放到压栈前栈基指针的下一位置
leave 撤销执行main函数建立的堆栈
ret 函数返回
然后是f函数:
pushl %ebp EBP寄存器的值压栈
movl %esp, %ebp 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针
subl $4,%esp 栈顶指针下以4个单位,分配一个单元
movl 8(%ebp), %eax EBP寄存器加8
movl %eax,( %esp) 将EAX寄存器中存储的立即数8放到ESP寄存器现在所指位置上
call g 调用函数g
leave 撤销执行main函数建立的堆栈
ret 函数返回
最后是g函数:
pushl %ebp EBP寄存器的值压栈
movl %esp, %ebp 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针
movl 8(%ebp), %eax EBP寄存器加8,指向标号5的位置,将标号5的内容放到EAX寄存器中
addl $2804,%eax 把立即数2804加到EAX寄存器中
pool %ebp 恢复函数f的函数调用栈基指针
ret 函数返回
4.总结
这次实验在虚拟机中编写了一个简单地C语言代码,并且将它转换成汇编语句,分析汇编语句执行的过程来进一步了解计算机时如何工作的。通过汇编语言来接近机器语言,充分体会计算机在执行过程中所执行的的最“朴素”的语言。