内容一:实验报告相关说明。
所学课程:《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:调用被调函数时,总会想在堆栈区创立一个新的堆栈供函数使用。函数执行完毕后,会将其销毁。所以函数中的临时变量不起作用了。