zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209321 《Linux内核原理与分析》第二周作业

    计算机工作原理

    1.汇编指令执行过程

    2.总结

    • 1 汇编指令执行过程

    分析如下C程序汇编指令执行过程

    (1)使用vim新建一个main.c文件,并对main.c进行编辑,编辑完后使用gcc -S -o main.s main.c -32命令对main.c生成汇编代码。

    (2)输入vim main.s查看生成的汇编代码。

    (3)在vim main.s文件中通过“g/.s*/d”命令即可删除所有以“.”打头的字符串,就获得了“干净”的汇编代码。

    (4)具体汇编过程如下:

    假定堆栈为空栈的情况下EBP和ESP寄存器都指向栈底

    • 程序从main函数开始执行,第18行是开始执行的第一条指令,第18行指令的作用是把ESP寄存器指向标号为1的位置(地址减4),预留出一个存储单元后,把EBP寄存器的值地址2000放到存储单元中。

    • 开始执行第18行指令时,EIP寄存器已经自动加1指向了第19行指令,第19行指令的作用是将EBP寄存器也指向标号为1的位置。

    • 开始执行第19行指令时,EIP寄存器已经自动加1指向了第20行指令,第20行指令的作用是ESP寄存器减4,也就是ESP寄存器指向了标号为2的位置,此时栈空间的内容没有发生任何变化。

    • 开始执行第20行指令时,EIP寄存器已经自动加1指向了第21行指令,第21行指令的作用是把立即数8放入了ESP寄存器指向的标号为2的位置。这条语句的EBP和ESP寄存器没有发生任何变化,栈空间发生了变化。第20行和第21行是为接下来调用f函数做准备,即压栈f函数所需的参数。

    • 开始执行第21条指令时,EIP寄存器已经自动加1指向了第22行指令,第22行指令是调用f函数,执行第22行指令时,EIP自动加1变为23,第22行指令的作用是ESP寄存器地址减4,指向了标号为3的位置,然后将EIP寄存器存的23压入栈,接着把f函数的第一条指令行号9放入EIP寄存器中。

    • 开始执行第9行指令,第9行指令的作用是ESP寄存器地址减4,指向了标号为4的位置,然后把EBP寄存器的值地址1996放到标号为4的位置。

    • 开始执行第9行指令时,EIP寄存器已经自动加1指向了第10行指令,第10行指令使得EBP寄存器和ESP寄存器一样指向了标号为4的位置。

    • 开始执行第10行指令时,EIP寄存器已经自动加1指向了第11行指令,第11行指令的作用是ESP寄存器地址减4,指向了标号为5的位置。

    • 开始执行第11行指令时,EIP寄存器已经自动加1指向了第12行指令,第12行指令的作用是EBP的值加8,加8之后是标号2,标号2的位置存放的是立即数8,把立即数8存放到EAX寄存器中。

    • 开始执行第12行指令时,EIP寄存器已经自动加1指向了第13行指令,第13行指令的作用是把EAX寄存器中的立即数8放到标号为5的位置,这样做的目的是将函数f的参数取出来,为调用函数g做好参数入栈的准备。

    • 开始执行第13行指令时,EIP寄存器已经自动加1指向了第14行指令,第14行指令是调用g函数,执行第14行指令时,EIP自动加1变为15,第14行指令的作用是ESP寄存器地址减4,指向了标号为6的位置,然后将EIP寄存器存的15放到标号为6的位置,接着把g函数的第一条指令行号2放入EIP寄存器中。

    • 开始执行第2行指令,第2行指令的作用是ESP寄存器地址减4,指向了标号为7的位置,然后把EBP寄存器存储的行号4放到标号为7的位置。

    • 执行第2行指令时,EIP自动加1指向了第3行指令,第3行指令的作用是使得EBP和ESP一样,都指向了标号为7的位置。

    • 执行第3行指令时,EIP自动加1指向了第4行指令,第4行指令的作用是EBP的值加8,加8之后是标号5,标号5的位置存放的是立即数8,把立即数8存放到EAX寄存器中。

    • 开始执行第4行指令时,EIP自动加1指向了第5行指令,第5行指令的作用是把立即数2加到EAX寄存器中,8+2=10,EAX寄存器为10。

    • 开始执行第5行指令时,EIP自动加1指向了第6行指令,第6行指令的作用是把栈顶的数值标号4放到EBP寄存器中,EBP寄存器又指向了标号为4的位置,同时把ESP寄存器加4,ESP寄存器指向了标号为6的位置。

    • 开始执行第6行指令时,EIP自动加1指向了第7行指令,第7行指令的作用是从堆栈栈顶,也就是编号为6的位置,取出里面的内容(即行号15)放入EIP寄存器中,同时ESP寄存器加4,ESP寄存器指向了标号为5的位置。

    • 开始执行第15行指令,第15行指令的作用是把EBP寄存器的内容放到ESP寄存器中,现在,ESP和EBP寄存器都指向了标号为4的位置,然后把标号4的内容(也就是标号1)放回EBP寄存器,EBP指向了标号为1的位置,ESP寄存器地址加4,指向了标号为3的位置。

    • 开始执行第15行指令时,EIP自动加1指向了第16行指令,第16行指令的作用是把ESP寄存器所指向的标号3的位置的内容(即行号23)放入到EIP寄存器中,同时,ESP寄存器地址加4,指向了标号为2的位置。

    • 开始执行第23行指令,第23行指令的作用是把EAX寄存器加立即数2,也就是10+2=12.

    • 开始执行第23行指令时,EIP自动加1指向了第24行指令,第24行指令的作用是把EBP寄存器的内容放到ESP寄存器中,现在,ESP和EBP寄存器都指向了标号为1的位置,然后把标号1的内容(也就是标号0)放回EBP寄存器,EBP寄存器指向了标号为0的位置,ESP寄存器地址加4,指向了标号为0的位置,程序执行完毕。

    • 2 总结

    冯诺依曼理论的要点是:数字计算机的数制采用二进制,计算机应该按照程序顺序执行。冯诺依曼体系结构的主要内容是:计算机由控制器,运算器,存储器,输入设备,输出设备五大部分组成;程序和数据以二进制代码形式不加区别的存放在存储器中,存放位置由地址确定;控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器控制指令的执行,控制器具有判断能力,能根据计算结果选择不同的工作流程。计算机在工作时,先从内存中取出第一条指令,通过控制器的译码,按照指令的要求,从存储器中取出数据,进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去,接下来,再取出第二条指令,在控制器的指挥下完成规定操作,依次进行下去,直至遇到停止指令。

  • 相关阅读:
    如何看Linux服务器的load average
    java中File读取文件中文乱码
    LR代理录制
    虚拟机打开虚拟文件报不兼容,无法使用
    面向对象示例-注册登录例子
    pickle 模块
    item方法
    加密方法
    @classmethod 和 @staticmethod 用法
    python 中 @property 的用法
  • 原文地址:https://www.cnblogs.com/traceurli/p/13835289.html
Copyright © 2011-2022 走看看