您的位置:首页 > 运维架构 > Linux

linux内核分析——简单代码反汇编为汇编代码分析

2017-03-01 23:53 316 查看

main.c如下:

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

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

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

然后反汇编:

gcc –S –o main.s main.c -m32


生成main.s汇编文件,打开去掉前面有点“.”的行(这些行在汇编中没什么用起辅助作用)如下:

1  h:
2	pushl	%ebp
3	movl	%esp, %ebp
4	movl	8(%ebp), %eax
5	addl	$2, %eax
6	popl	%ebp
7	ret
8  f:
9	pushl	%ebp
10	movl	%esp, %ebp
11	subl	$4, %esp
12	movl	8(%ebp), %eax
13	movl	%eax, (%esp)
14	call	h
15	leave
16	ret
17 main:
18	pushl	%ebp
19	movl	%esp, %ebp
20	subl	$4, %esp
21	movl	$4, (%esp)
22	call	f
23	addl	$1, %eax
24	leave
25	ret
%eax通用寄存器默认存储函数的返回值,%ebp:指向栈基址,%esp指向栈顶,

pushl 是向入栈,栈的地址是向低地址增加的。

popl 是出栈

leave(enter leve 是一组)等价于:movl %ebp %esp; popl %ebp就是把暂时的栈收回,把栈顶存的ebp返回给ebp.

enter 等价于:pushl %ebp; movl %esp %ebp

ret是return,等价于popl %eip; subl $4 %esp 即把原来存储的地址返回,栈指针++

注意每次push,pop,%esp都会改变的++或者--

然后自己画个堆栈分析就是了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反汇编 汇编
相关文章推荐