实验目的:
通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验过程:
通过vi程序进行编程:
- int g(int x)
- {
- return x + 3;
- }
- int f(int x)
- {
- return g(x);
- }
- int main(void)
- {
- return f(8) + 1;
- }
保存为main.c文件
使用反汇编命令
gcc -S -o main.s main,c -m32
-S : 编译为汇编语言程序
-o : 指定目标程序名称
-m32 : 指定编译为32位环境的汇编代码
得到结果:
删除符号项:
堆栈图:
首先main函数开始执行,将基址寄存器的值进栈,用于系统控制main函数返回。
movl %esp, %ebp
此行代码将esp寄存器的内容赋值给ebp,即ebp和esp都指向地址1的位置
subl $4, %esp
将esp的指针指向下面一个位置
movl $8, (%esp)
将立即数8存放在当前esp所指位置
call f
调用f函数
call g
调用g函数
最后返回main函数,结果:
实验总结:
学到一些基本的汇编语言,知道了汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植
eax默认作为函数返回值保存寄存器
ebp为栈低指针寄存器
esp为栈顶指针寄存器(运行中的每个程序都有一段堆栈空间,用来存放程序运行时数据)
eip为当前指令位置寄存器
push为压栈指令
pop为出栈指令
add为加法指令