通过反汇编C语言小程序学习Liunx汇编语言

大家好!    我是来自山东师范大学的吴乐。
    今天在《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一单元学习了一些基本的汇编语言

    现在我分享一下我的学习历程,本次课程的目的是通过反汇编一段简单的小程序学习基本汇编指令。

    不废话了,上图
    第一步:
 
首先在Code目录中编写一段简单的C语言小程序,不涉及输入输出,代码如下。

    • int g(int x)
    • {
    •   return x + 1;
    • }
    • int f(int x)
    • {
    •   return g(x);
    • }
    • int main(void)
    • {
    •   return f(6) + 1;
    • }

第二步

gcc –S –o main.s main.c -m32

汇编结束后打开如图所示。

第三步:

去除一些链接之后,得到了干净的汇编代码。

第四步:
堆栈的调用过程(设初始ebp为0位置每次减4字节相当于升1个标号,EIP逻辑对应代码的行号):
调用变化如下
main                                                  f                                                            g                                                 f                    main
EIP:18   19    20    21    22    23        9     10     11    12       13     14      15      2     3     4      5       6      7     8    16   17   24     25   26
ebp:0    0      1      1      1       1        1      1       4      4        4        4       4       4     4     7      7       7      4     4     1     1     1      0     ...
esp:0     1      1      2      2       3       3      4       4      5        5        5       6       6     7     7      7       7      6     5     3     2     2       0     ...
eax:0     0      0      0      0       0       0      0       0      0        6        6       6       6     6     6      6       7      7     7     7     7     8       8     8
栈内的元素按先后顺序分别为:ebp0    6   eip23  ebp1   6   eip15  ebp4

总结:计算机的工作原理与机制
可见,计算机的工作流程也是取指执行的过程。
其次,它是在顺序执行基础上加入适当的跳转机制。
主存的内容必须载入不同寄存器中cpu才能进行处理。
最后,它实际上是通用图灵机的具体实现,并把控制与储存部分封装为CPU处理中心。

 

posted @ 2015-03-18 20:27  20169205-lewo  阅读(275)  评论(0编辑  收藏  举报