• 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 总结

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

  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/traceurli/p/13835289.html
Copyright © 2020-2023  润新知