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

时间:2021-04-12 00:54:39

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都会改变的++或者--

然后自己画个堆栈分析就是了。