计算机是如何工作的---linux内核学习笔记(一)

内容一:实验报告相关说明。

所学课程:《Linux内核分析》MOOC课程  

链接:http://mooc.study.163.com/course/USTC-1000029000

虚拟实验室实验截图

 

内容二:汇编代码的工作过程中堆栈的变化分析

分析分两部分:(堆栈地址的标号没有对齐,请谅解)

第一部分是堆栈变换图。

第二部分是变换图的说明。

 

第一部分 图解

 

第二部分 说明

一:

程序从main函数开始执行,此时假设ESP,EBP两个指针均指向位置0 ,表示堆栈为空。如图(1)

 二:

执行语句 18,19

pushl         %ebp

movl          %esp,%ebp

EBP,ESP的变化如图(2)所示,均指向位置1。位置0到位置1有4个字节大小的空间,用来存储 EBP寄存器内之前的内容。

三:

执行语句 20,21

subl    $4, %esp          //esp的值减4相当于esp指向位置2

movl   $90, (%esp)

如图(3)所示,EBP,ESP分别指向位置1和位置2。寄存器EAX的值为90 。

四:

执行语句 22 ,call f 语句等价于

pushl  %eip        // 此时eip的为下一条指令(第23条指令)用 eip(23)表示

movl   函数f的地址 ,  %eip

如图(4)所示,EBP,ESP分别指向位置1和位置3。 eip指向第9行的指令

五:

执行语句 9,10 ,11,12,13

       pushl         %ebp

       movl          %esp, %ebp

       subl           $4,%esp

       movl          8(%ebp), %eax

       movl          %eax, (%esp)

如图(5)所示,EBP,ESP分别指向位置4和位置5。%eax的值为 *(8+ ebp),等于90 。红色方框所示。

五:

执行语句 14,2,3,4,5

       call   g

       pushl         %ebp

       movl          %esp, %ebp

       movl          8(%ebp), %eax

如图(6)所示,EBP,ESP均指向位置7。

%eax的值为 1014+90 = 1104 这个值可以保存下来。

六:

执行语句6  popl          %ebp,如图(7)所示,分别指向位置4和位置6

七:

执行语句7  ret  等价于popl %eip ,程序下一条执行的指令为语句15. 如图(8)所示,分别指向位置4和位置5 。

      

八:

执行语句15 ,leave 语句等价于

                  movl          %ebp,%esp

                   popl          %ebp

         相当于撤销函数f所使用的堆栈

如图(9)所示,

执行movl      %ebp, %esp  EBP,ESP均指向位置4。

执行popl                %ebp EBP,ESP分别指向位置1和位置3。

九:

执行语句16  ret

如图(10)所示,EBP,ESP分别指向位置1和位置2。程序下一条执行的指令为语句23。

十:

执行语句23,24

       addl $90, %eax

       leave

如图(11)所示,EBP,ESP均执行0。此时堆栈为空。程序运行结果保存在EAX寄存器中。其值为eax+90 = 1104 + 90=1194 

内容三:小结

1:计算机读取的下一条指令总是存储在EIP中。

2:程序是从main函数开始执行。

3:当程序调用一个新的函数时,是通过CALL指令来实现的。CALL指令做了两件事,第一件事是将程序要执行的下一条指令(即EIP的值)存入堆栈中。第二件事是将EIP的值修改为该函数的地址。从而开始执行被调用的函数。

4:调用被调函数时,总会想在堆栈区创立一个新的堆栈供函数使用。函数执行完毕后,会将其销毁。所以函数中的临时变量不起作用了。

原文地址:https://www.cnblogs.com/esxingzhe/p/4322197.html