2020-2021-1 20209317 《linux内核原理与分析》第二周作业

本周的实验目的是为了了解程序执行和程序调用,实验内容为将一个具有多层函数调用的C语言程序编译为汇编语言,并分析执行过程,通过分析其执行过程了解函数调用具体是怎么实现的,尤其是函数调用之间的参数传递。

下面截图为C语言代码:

编译为汇编语言文件并去掉编译信息后的汇编代码如下:

从汇编语言代码可以看到,每个被调用函数执行的第一步就是将调用函数的栈基址入栈,并将该位置的下一个位置作为自己的栈的基址,从这点可以看出所有的程序所用的栈空间都是连续的一片内存,通过书中的分析我们可以知道,push将栈指针寄存器的值减4(32位机器下),栈由内存高地址向低地址生长。继续向下分析,在调用者函数调用被调用者函数之前,会将参数放入调用者栈的最顶端,被调用者可以通过esp+8、esp+12...来访问所有参数列表中的参数(64位系统中对通过栈传递的参数数量进行了限制,超过限制的参数通过别的途径进行传递)。将参数位置放好之后,调用者函数通过call指令调用被调用者函数,之后被调用者函数以相同的过程进行操作并执行函数体。在执行完函数体之后,通过leave指令释放用户栈,通过ret指令返回到调用者函数。另外,该过程中并没有体现调用者寄存器eax、ecx、edx这三个寄存器为调用者函数在调用别的函数之前所保存的函数执行状态,由调用者保存,相当于保存寄存器中的值,让被调用函数能够使用这些寄存器。ebx、esi、edi为被调用者保存的寄存器,被调用者在执行之前需要将这三个寄存器值保存,并在退出函数的时候将这三个寄存器的值还原。另外,函数调用通过eax寄存器来传递单个返回值。

posted @ 2020-10-17 16:34  20209317李明帅  阅读(122)  评论(0编辑  收藏  举报