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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值