Linux内核分析-1/反汇编(堆栈)
来源:互联网 发布:结婚录像制作软件 编辑:程序博客网 时间:2024/05/29 09:44
《Linux内核分析》MOOC课程
运行环境:实验楼
/*main.c*/int g(int x){ return x + 3;}int f(int x){ return g(x);}int main(void){ return f(8) + 1;}
/*Makefile*/all: gcc –S –o main.s main.c -m32
/*main.s*/ .file "main.c" .text .globl g .type g, @functiong:.LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 8(%ebp), %eax addl $3, %eax popl %ebp .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc.LFE0: .size g, .-g .globl f .type f, @functionf:.LFB1: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 subl $4, %esp movl 8(%ebp), %eax movl %eax, (%esp) call g leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc.LFE1: .size f, .-f .globl main .type main, @functionmain:.LFB2: .cfi_startproc pushl %ebp //将栈底压栈 .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp //将栈顶的值赋给栈底 .cfi_def_cfa_register 5 subl $4, %esp //栈顶 movl $8, (%esp) //将8赋给栈顶 call f addl $1, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc.LFE2: .size main, .-main .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits
gcc –o main main.c -m32 //可以编译为可执行文件//然后在命令行下./main 就开始执行了//这个过程大概是bash解析了命令行.并fork并exec了main将main从设备块中读取到高速缓冲块中,然后拷贝到用户空间的对应段上.?,并建立栈顶esp和栈底ebp和eip//栈顶在栈底下面,中间无间隔,eip指向main中的 pushl %ebp然后从main开始运行,在栈内?//栈内的哪个地址?假设栈内的地址为0xbfe5 d38f,栈向下增长
/*用户栈*//*从高到*/主程序的参数主程序调用后的返回地址第0帧地址局部变量fun1的参数fun1调用后的返回地址第1帧地址局部变量
汇编代码解析
main
- main标号内的pushl执行之前的状态
- pushl %ebp
下面的图表示是上面的语句执行完之后的状态即下图表示的是 pushl %ebp 后的状态
- movl %esp, %ebp
- subl $4, %esp
- movl $8, (%esp)
- call f
f
- pushl %ebp
- movl %esp, %ebp
- subl $4, %esp
- movl 8(%ebp), %eax
该行没有改变栈,只是将(ebp-8)地址内的值(8)付给了eax
- movl %eax, (%esp)
- call g
g
- pushl %ebp
- movl %esp, %ebp
- movl 8(%ebp), %eax
该行没有改变栈,只是将(ebp-8)地址内的值(8)付给了eax
- addl $3, %eax
改行没有改变栈,只是将eax加了3,此时为11
- popl %ebp
- g:ret
f
- f : leave
- f:ret
main
- addl $3, %eax
此时没改变堆栈,只是将eax中的值加了3,此时为14
- leave
- ret
注意:
这里面需要注意的是%eax是独立于栈存在的,所以不会消失,所以返回值都存在%eax寄存器中栈分为四种,这里面分析的栈是满减栈,另外还有空减栈,满增栈,满减栈
参考资料
Push, Pop, call, leave 和 Ret 指令图解
阅读全文
0 0
- Linux内核分析-1/反汇编(堆栈)
- linux内核分析1--反汇编分析
- Linux内核分析 学习笔记之反汇编分析
- 反汇编及函数调用堆栈分析
- 第1节 反汇编一个简单的C程序【Linux内核分析】
- linux内核分析——简单代码反汇编为汇编代码分析
- Linux内核分析【1】--分析汇编代码
- Linux内核分析-反汇编一个简单的C程序并简单分析
- Linux内核分析——分析C程序的反汇编内容
- 用GDB反汇编调试linux内核
- Linux内核分析(堆栈)
- 根据PPC反汇编代码分析堆栈内容
- 《Linux内核分析》(一)——反汇编一个简单的C程序并分析其汇编代码的执行
- 《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程
- ARM Linux内核驱动异常定位方法分析--反汇编方式
- ARM Linux内核驱动异常定位方法分析--反汇编方式
- ARM Linux内核驱动异常定位方法分析--反汇编方式
- ARM Linux内核驱动异常定位方法分析--反汇编方式
- c++继承(单继承,多继承,菱形继承和虚继承)详解
- Linux基础命令
- sqoop数据迁移
- css基础进阶
- textarea根据内容自动增加高度
- Linux内核分析-1/反汇编(堆栈)
- 链表所有的相关操作(合并,查找,逆制,判环,相交)
- WebGL之旅(五)复合变换
- 2.1 linux存储管理-内存管理基本框架
- 每日一题——二进制数1的个数
- 十六进制颜色值与rgba格式的互相转换
- 58同城架构师带你实战高可用架构设计
- 【剑指offer】正则表达式匹配
- 多线程面试题