zoukankan      html  css  js  c++  java
  • 初识计算机工作过程

    这周在网易云课堂上学习了《Linux内核分析》——计算机是是如何工作的。本周学习内容有存储计算机工作模型、x86会变基础以及通过反编译一段简单的C语言的源代码,初步接触了计算机的工作过程。这里通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的。

     

    先贴上一张对一个简单的C语言程序反汇编后的汇编代码的图片:

    这段汇编代码是反编译后去除了以 ".“ 开头的行后的汇编代码。

    代码中 %ebp 是栈底指针,%esp 是栈顶指针,%eax默认是存储当前函数的返回值。

    操作 pushl 是压栈操作,popl 是弹栈操作,movl 是赋值操作,add 是加操作,sub 是减操作,call 是调用函数操作,leave 是销栈操作,ret 是返回操作。

     

    接下来分析下整个程序执行过程:

    因为程序都是从 main 函数开始执行的,所以eip 首先指到第17行 main 函数的地址,并将 eip 的值压到某个栈中,然后执行本程序 main.c。

    main 函数首先将 %ebp 所指向的地址压入调用 main 函数的栈中( pushl %ebp )。然后将栈顶的值赋值给栈底( movl %esp, %ebp ),也就意味着形成了一个新的空栈( 用于执行main函数中的操作 )。之后将栈顶往下减4个字节(32位)( subl $4, %esp ),然后形成了一个新的栈顶以及一个新的栈顶存储空间。之后将值4赋值到栈顶( molv $4, (%esp) )。然后进行函数的调用操作( call f )。call 操作将当前行的下一行地址压入栈并将 eip 指向函数 f 的地址。当调用完成后执行加操作( addl %7, %eax )。 接下来进行 leave 操作。leave 操作将栈底指针赋值给栈顶( 将执行 main 的栈清空 )并将栈顶存储的上一个栈的栈底地址赋值给 %ebp 并弹出该值,这也就意味着当前执行函数 main 的这个栈已经被销毁并且回到调用 main 函数的那个栈中。最后有一个返回操作( ret ),将栈中存储的 eip 的值赋值给当前 eip,其指向调用 main 函数的下一行。函数 main 执行完毕。

    接下来的 f 函数和 g 函数也进行相似的操作。

    因为 g 函数中没有对栈顶进行操作,栈顶与栈底指向同一地址,所以就不用 leave 操作先将栈底的地址赋值给栈顶再移除栈底,直接将栈底弹出即可。

    每个函数在执行过程中,都是先建立用于执行本函数的栈,然后执行操作,最后销毁栈后返回。并不是所有操作都是对本函数的栈进行操作。

     

    总结:

    当今的计算机基本上都是用的冯诺依曼体系结构,通过总线将 CPU 与内存连接在一起,CPU 从内存中相应地址区域调取指令并执行。计算机执行命令用到最多的结构是栈结构,将命令执行结果压入栈中,以备以后命令调取和返回。

    对于单任务计算机,计算机顺序执行所有命令。每个程序都要等到上一个程序执行完毕后才能执行。多任务计算机更多的是多个程序同时运行,同一个核心以极快的速度在多个不同的程序之间进行跳跃,每次只执行很少的命令,这样看起来像在同时进行一样。

    从目前所学的知识来看,计算机所执行的操作就有三个,分别是 addl, subl, movl。push,pop,call,leave,ret 等操作都是用基础的那三个操作组合而成的。计算机通过基础的三个命令执行所有操作,高效便捷。

     

    注:本人第一次写此类博客,写的并不是很好,如有不足之处请指出,我虚心求教,谢谢各位!

     

    作者:李若森

    原创作品转载请注明出处

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

  • 相关阅读:
    二分图最大匹配的König定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/Hitman_47/p/4322035.html
Copyright © 2011-2022 走看看