实验一 反汇编一个简单的C程序
实验过程
-
首先创建main.c文件,然后使用vim编辑代码。
-
然后使用如下命令编译成汇编代码文件main.s。
$ gcc –S –o main.s main.c -m32
- main.s删除“.”字符开头后的代码
分析main.s的汇编代码
g:
pushl %ebp//ebp入栈
movl %esp, %ebp//ebp=esp,生成新的堆栈空间
movl 8(%ebp), %eax//将变址寻址ebp+8所指向内存的值存入eax
addl $19, %eax//将eax的值加19
popl %ebp//ebp出栈,esp减去4,指向上一个位置
ret//返回,继续执行下一条指令
f:
pushl %ebp//ebp压栈,esp指向下一个位置
movl %esp, %ebp//将ebp指向esp的位置
subl $4, %esp //esp减4,即指向下一个位置
movl 8(%ebp), %eax//ebp向上移动两位,eax=8
movl %eax, (%esp)//eax内容存入esp指向的内存
call g//eip入栈,调用g
leave//包括movl %ebp,%esp和popl %ebp两条指令
ret//返回,继续执行下一条指令
main:
pushl %ebp//ebp压栈
movl %esp, %ebp//将ebp指向esp所指向的栈地址。
subl $4, %esp//esp指向的位置向下移动一格
movl $19, (%esp)//立即数19放到esp所在位置
call f//执行pushl eip和movl f eip两个动作,eip压栈,ebp指向下一个位置,eip指向f。
addl $1, %eax
leave//堆栈回到main函数最初的状态
ret//退出main
总结
通过本次的学习和实验,对于C语言程序在计算机上具体是怎么工作的有了一个比较清晰的认识,了解到寄存器的作用和汇编指令的执行过程,遇到的问题是对于堆栈的理解不强,但通过实验加深了认识。