Linux内核分析第一课作业 栈分析

基本概念:

常用寄存器:

ebp 栈底,

esp 栈顶,

入栈是esp向低地址移动,出栈是esp向高地址移动

eip指向的内存地址是下一行要执行的代码地址。eip在没有其它控指指令修改的情况下,总是会线性自增,读完当前指令后,自动增加地址,指向下一条指令。

C语言编译成汇编堆栈分析

C语言代码

 int g(int x){        
    return x + 99;
 } 
 int f(int x)
 {        
    return g(x);
 } 
 int main(void)
 {       
    return f(3) + 2;
 }


编译成汇编gccSo main.s main.c -m32

Linux内核分析第一课作业 栈分析_第1张图片

假设原始情况下ebp = 100, esp=100 。

从main开始,分析一下堆栈。

18  pushl %ebp, 直接访问寄存器,将ebp中的值推入栈, 相当于暂时保存了ebp的值:

ebp=100, esp=96, 

addr data
96 100

19  movl %esp, %ebp, 将esp的值赋值给ebp

ebp=96, esp=96

以上2行,相当于在开始main函数前,保存了久的栈环境,然后重置了一个空的新栈。

20     subl    $4, %esp , 立即寻址,esp的值减去4.

ebp=96, esp=92

21   movl    $3, (%esp) , 间接寻址, 向esp指向的内存赋值3

ebp=96, esp=92

addr data
92 3
96 100


以上2行,相当于C语言的中给函数f的参数。


call f , 调用函数f, 相当于先

push %eip

jmp f

所以:

ebp=96, esp=88

addr data
88 addr of EIP in main line 23 
92 3
96 100


现在来到函数f,头2行

pushl %ebp

movl %esp. %ebp

在main中已经分析过,功能就是保存久的栈,重新定一本函数的栈。

ebp=84, esp=84

addr data
84 96
88 addr of EIP in main line 23
92 3
96 100


subl         $4, %esp

movl8(%ebp), %eax

movl%eax, (%esp)


ebp=84, esp=80

addr data
80 3
84 96
88 addr of EIP in main line 23
92 3
96 100


call    g

ebp=84, esp=76


addr data
76 addr of EIP in f line 15
80 3
84 96
88 addr of EIP in main line 23
92 3
96 100


调用g函数, 还是和之前一样,先重置栈

pushl %ebp

movl %esp, %ebp

ebp=72, esp=72

addr data
72 84
76 addr of EIP in f line 15
80 3
84 96
88 addr of EIP in main line 23
92 3
96 100


movl  8(%ebp), %eax

addl   $99, %eax

取addr=80的3到eax, 然后加上99放到eax, 做为g函数的返回值

所以eax=102

popl    %ebp , 恢复f的栈,准备离开g

ebp=84, esp=76

addr data
76 addr of EIP in f line 15
80 3
84 96
88 addr of EIP in main line 23
92 3
96 100

ret , 相当于popl %EIP

ebp=84, esp= 80, eip=addr of EIP in f line 15

leave 恢复栈的作用,相当于 下面2条指令

movl %ebp, %esp

popl %ebp

结果:

ebp=96, esp=88

ret

ebp=96, esp=92, eip=addr of EIP in main line 23

addl$2, %eax

将2和eax相加 eax=102+2=104

addr data
92 3
96 100

leave, main函数中恢复栈

ret,main函数退出,到运行时程序中。



施正楚 -  原创作品转载请注明出处 - 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

你可能感兴趣的:(Linux内核分析第一课作业 栈分析)