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

来源:互联网 发布:windows桌面消失 编辑:程序博客网 时间:2024/05/12 22:18

作者:王鹤楼
原创作品转载请注明出处
《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, %espcall 0x12345    pushl %eip    movl 0x12345, %eipret    popl %eipenter    pushl %ebp    movl %esp,%ebpleave    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   %ebpmovl    %esp, %ebp

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

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

leaveret这两句语句对应的代码为:movl %ebp,%esppopl %ebppopl %eip

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

0 0
原创粉丝点击