计算机是如何运行的

第一次写博客,不会怎么使用排版功能,写的不好请大家见谅!

看计算机如何工作,我们先对一个简单的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方便函数使用;

你可能感兴趣的:(汇编,计算机,C语言,栈,32位)