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