-
实验:反汇编一个简单的C程序
一、先学习蓝墨云班课中第二周的视频资料,重点看了1-3-1和1-3-3,对应该实验。
二、实验过程:
(1)创建main.c文件,并编写简单的C语言程序
(2) main.c文件在vim中填写完成后,应当用Esc使其保持NORMAL状态,并输入 “:wq” 保存并退出。
(3)使用语句 $ gcc –S –o main.s main.c -m32,使main.c编译成32位的汇编程序。
最后通过vi main.s打开main.s查看编译结果如图:
(4)利用快捷键dd删除所在行,获得更加纯净的代码。
(5)编译后代码的理解,寄存器是如何工作的。
g函数:
2:EBP寄存器的值压栈
3:EBP寄存器指向标号7的位置
4:EBP寄存器加8,指向标号5的位置,将标号5的内容放到EAX寄存器中
5:把立即数15加到EAX寄存器中
6:把标号7的内容放回到EBP寄存器
7:函数返回
f函数:
9:EBP寄存器的值压栈
10:EBP寄存器指向标号4的位置
11:ESP寄存器减4,指向标号5的位置
12:EBP寄存器加8
13:将EAX寄存器中存储的立即数8放到ESP寄存器现在所指位置上
14:调用函数g
15:撤销f函数的堆栈
16: 函数返回
main函数:
18:EBP寄存器的值压栈
19:EBP寄存器指向标号1的位置
20:ESP寄存器向下移动一个标号
21:把立即数7放入ESP寄存器指向的位置
22:EIP寄存器跳转到f函数的位置
23:EAX寄存器加立即数3
24: 撤销main函数的堆栈
25: 函数返回
三、实验中遇到的问题及解决办法
1、main.c如何保存并退回到终端。先按esc键,使其处于normal状态,然后输入:wq保存并退回至终端。
2、main.s汇编代码的理解,寄存器的使用。之前学过,但忘了很多了,要查资料复习一下。