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

1.学习到的新命令

  • dd: 删除光标所在行
  • i: 进入编辑模式
  • esc:进入命令模式
  • wq:写入文件并退出

2.esp和ebp

esp永远指向栈顶元素。不是指向没有数据的空地址。

push时,先减四后赋值

ebp永远指向栈底元素。他一般存储了上一个函数的ebp。

进入函数中,先push ebp

再mov ebp,esp 这时俩寄存器都指向保存的上个函数的ebp的值。

离开函数时执行leave时,他的作用与上面的相反,相当于

mov esp,ebp  让esp指向当前的栈底

pop ebp 将栈顶(esp指向的内存)的值给ebp这样,就恢复了上个函数调用此函数至少得值,esp因为弹栈而加四,然后指向的是返回地址。

随后执行ret,ret指令相当于

pop eip 即将栈顶的值(esp指向的内容)复制给eip指令寄存器。esp+4。

3.实验过程分析

C程序

int g(int x)
{
return x + 3;
}

int f(int x)
{
    return g(x);
}

int main(void)
{
    return f(8) + 1;
}

汇编代码

汇编过程分析

汇编程序也是从main开始执行,
18 pushl %ebp
19 movl %esp, %ebp
将ebp内容压入栈,然后将esp内容赋值给ebp

20 subl $4, %esp
21 movl $13, (%esp)
esp向下移动四个字节,,将13放在esp指定位置里,esp向下移动一个单位

22 call f
相当于
pushl %eip(*)
movl f %eip(*)
将eip寄存器值即23行指令地址放入esp指向位置,esp减4,进入f函数,此时eip存放行号9指令地址

9 pushl %ebp
将ebp内容压入栈,此时ebp指向96

10 movl %esp, %ebp
将esp值赋值给ebp

11 subl $4, %esp
esp向下移动一个单位

12 movl 8(%ebp), %eax
将ebp内容加8放入eax寄存器中

13 movl %eax, (%esp)
将eax内容放入esp指向的地址中

14 call g
相当于
pushl %eip(*)
movl g %eip(*)
将eip寄存器值即15行指令地址放入esp指向位置,esp减4,进入g函数,此时eip存放行号2指令地址

2 pushl %ebp
3 movl %esp, %ebp

4 movl 8(%ebp), %eax
5 addl $3, %eax
6 popl %ebp
ebp寄存器值加8即向上移两个单位,将13放入eax寄存器中,eax值再加3,栈顶的值放入ebp,而被迫值为84

7 ret
相当于
popl %eip(*)
栈顶值给eip并弹出

15 leave
相当于
movl %ebp, %esp
popl %ebp

16 ret

23 addl $1, %eax
24 leave
eax寄存器值加1

原文地址:https://www.cnblogs.com/dyyblog/p/13812922.html