关于计算机将c代码转换成汇编代码的过程描述

来源:互联网 发布:本.西蒙斯体测数据 编辑:程序博客网 时间:2024/04/30 07:28

一、实验截图:

验楼中的linux操作平台上的指令代码:

最终转换成的汇编代码:



二、汇编代码的分析

%ebp,%esp都指向栈顶

main函数开始:pushl  %ebp——实际上就是把ebp的值放入,即ebp的值0放入第一个栈;

                             movl   %esp,%ebp——%esp指向1的位置(移动4个字节),%ebp也指向1的标号位置;

                            subl      $4,%esp——%esp指向的位置向下移动一个位置,即为2的位置;

                            movl     $9,(%esp)——就是将9指向%esp的位置;

                           call       f ——就是在2的位置加上eip,eip指向f,ebp指向下一个位置;

此时跳转到f的位置,则从f的位置开始执行:

                           pushl  %ebp——把ebp指向4的位置,esp也指向4的位置;

                          movl    %esp,%ebp——即%esp也指向4的位置;

                            movl   8(%ebp),%esp——也即此时esp的值就是8;

                           call    g——跳转到g的位置,即eip指向g的位置;

跳转到g的位置,类似于f。

leave相当于这两条指令:movl %ebp,%esp

                                              pop%ebp 

他是:因为esp指向esp的位置,此时为4.

popl %ebp——相当于指向最初始的位置。

整函数的堆栈就是先向下增长,然后再向上还原。将程序变成了指令流。


三、总结:

将c代码转换成汇编代码的过程,就是整函数的堆栈的向下增长和向上还原的过程。



                                                                                                                                                                                               庄华健

                                                                                                                                                  Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

1 0