第一次写博客,不会怎么使用排版功能,写的不好请大家见谅!
看计算机如何工作,我们先对一个简单的C语言程序进行反汇编,这是在实验楼进行C语言反汇编实验C语言源代码的截图:
把C语言源代码反汇编成32位汇编代码
去掉干扰代码后的干净代码
下面我们对这段代码进行分析
注:ebp后的数字代表ebp所在位置,eip后面数字代表反汇编后代码(上图)执行位置;
初始状态下ebp和esp都指向栈底,即空栈,pushl %ebp之后,esp-4然后把当前ebp压入栈中,movl %esp,%ebp相当于C语言ebp=esp,subl $4,%esp和movl $6,(%esp)相当于pushl $6
call f相当于pushl %eip,mov f所在地址,%eip;pushl %ebp和movl %esp,%ebp两句相当于enter;
subl $4,%esp就是把esp减去4也就是向下移动一个单位, movl 8(%ebp),%eax 相当于eax=*(int32_t *)(ebp+8)此时eax=6,同理call g与call f一样;
leave相当于movl %ebp,%esp, popl %ebp;
总结:由上述分析可以看出,计算机在执行函数调用和函数的参数传递都是通过使用栈来进行的,在调用函数时,先对eip进行保存方便函数调用结束后返回执行,然后保存ebp栈底方便恢复栈在调用之前的状态,最后清空栈使ebp=esp方便函数使用;