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

本周总结:本周的学习内容主要是庖丁解牛Linux的第一章,然后看完书后,又跟着云班课加深学习了一下第一章的内容。第一章主要讲述了linux里的汇编指令的一些指令,比如movl,pushl,popl等等,这些指令都是围绕数据结构中的栈做文章的。贯穿这一章的是esp、ebp,eip指针寄存器。简单来说,ebp就是指的栈底,esp就是指着栈顶。eip就是正在执行的指令所在的位置,然后不断重复的进行入栈出栈操作。

C语言程序:

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

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

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

汇编去除无关项后:

g:
1	pushl	%ebp
2	movl	%esp, %ebp
3	movl	8(%ebp), %eax
4	addl	$3, %eax
5	popl	%ebp
6	ret
f:
7	pushl	%ebp
8	movl	%esp, %ebp
9	subl	$4, %esp
10	movl	8(%ebp), %eax
11	movl	%eax, (%esp)
12	call	g
13	leave
14	ret
main:
15	pushl	%ebp
16	movl	%esp, %ebp
17	subl	$4, %esp
18	movl	$8, (%esp)
19	call	f
20	addl	$1, %eax
21	leave
22	ret

ret指令等价于

popl %eip

call指令等价于

pushl %eip
movl f %eip

leave指令等价于

movl %ebp,%esp
popl %ebp

解析:

程序从15那里开始执行,此时,ebp和esp均指向栈底,标号为0,第15行,ebp 0进栈,esp-4,第16行,ebp-4,此时ebp与esp指向同一处,17行,esp再减4,18行,将立即数8存到栈里,即esp所指的位置,19行,执行call命令,将eip 20存入栈里,此时esp指向栈顶,进入f函数,7,8行过后,ebp和esp均指向栈顶,9行,esp-4,第10行,将ebp+8所在位置的立即数8存到eax里,第11行,将eax里的值8放到esp所指的位置,第12行,将eip 13存入栈里,执行g函数,经过前两步,esp,ebp均指向栈顶,第3行,将ebp+8所指未知的数8存入eax里,然后eax+3=11,第5行,ebp出栈,esp-4,ebp指针回退到上次ebp指针所指位置,然后ret,eip 13出栈,esp-4,继续执行第13行命令,然后ebp再出栈,ebp指针回退到上次ebp指针所指位置,然后第14行ret,eip 20出栈,esp-4,执行第20行命令,ebp再出栈,eax+1=12,然后leave,ret后返回值12

posted @ 2019-09-21 13:04  不摸鱼  阅读(153)  评论(0编辑  收藏  举报