《Linux内核分析》-X86汇编基础及实验总结

作者:王鹤楼
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

几个宏汇编对应的汇编指令
pushl %eax
    subl $4, %esp
    movl %eax, (%esp)
popl %eax
    movl (%esp), %eax
    addl $4, %esp
call 0x12345
    pushl %eip
    movl 0x12345, %eip
ret
    popl %eip
enter
    pushl %ebp
    movl %esp,%ebp
leave
    movl %ebp,%esp
    popl %ebp

左边main.c的C程序源代码,右边main.s是汇编main.c之后的代码

C程序与对应的反汇编程序

下面分析汇编代码main.s

17~25行是main函数
18: pushl %ebp 保存程序进入main函数之前的基地址指针寄存器内容到栈中
19: 把当前的栈指针赋值给基地址指针寄存器,即设置main函数的栈底
20: 栈指针向下移动一个位置
21: 把立即数29存到栈顶
22:调用f函数,并且把eip的下一条指令(addl $3, %eax)的地址压入栈中

8~16是f函数==>
9:保存调用此函数的基地址批针寄存器内容到栈中
10:把当前栈指针赋给栈的基地址指针寄存器,也就是设置当前函数栈的基地址
11:栈指针向下移动一个位置
12:把相对于ebp向上移偏2个地址的内容赋给eax,也就是把立即数29赋值给eax
13:把eax也就是立即数29压入栈中
14:调用f函数,同时把eip的下一条指令(leave)压入栈中

1~7是g函数
2:保存调用此函数的基地址批针寄存器内容到栈中
3:把当前栈指针赋给栈的基地址寄存器,也就是设置当前函数栈的基地址
4:把相对于ebp向上移偏2个地址的内容赋给eax,也就是立即数29
5:把1和eax寄存器的内容(29)相加赋给eax
6: 把栈顶的内容弹出来赋给寄存器ebp,然后esp减去4
7:返回语句,相当于popl %eip,程序执行中转到第15行

15:把函数f的栈的基地址赋给栈指针,然后把栈顶的内容弹出来也就是main函数的栈的基地址赋给ebp
16: 返回语句,相当于popl %eip,程序执行中转到第23句
23:调用函数f的返回结果存在eax中,把立即数3与 eax相加再存回eax
24:离开main函数

下面这张图片展示了栈的变化:
汇编程序对应的栈描述

进入每个函数开头都指有两句指令:

pushl   %ebp
movl    %esp, %ebp

作用就是保存调用函数栈的基地址,然后设置本函数栈底

退出一个函数时一般都会是如下两句

leave
ret
这两句语句对应的代码为:
movl %ebp,%esp
popl %ebp
popl %eip

以前内容就是学习《Linux内核分析》第一堂课的总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值