ia-32 C语言栈帧布局
来源:互联网 发布:caddy windows 编辑:程序博客网 时间:2024/06/07 08:44
说明
esp总是指向栈顶
ebp指向的位置开启一个新栈帧
所以ebp又称为stack frame pointerebp往上的栈帧是calling函数的栈帧
ebp往下的栈帧是called函数的栈帧called函数的输入参数是放在calling函数的栈帧里
called函数返回后,calling函数负责清理栈帧里的输入参数。ret addr 由call指令自动push到栈上
对于frame 0函数,它获取参数是通过ebp间接寻址来获取的
对于frame 0函数,它为即将被调用的函数准备参数是通过esp间接寻址来设置的
代码示例
.text .globl _add_and_print .p2align 4, 0x90_add_and_print: pushl %ebp movl %esp, %ebp subl $40, %esp # 分配足够的栈空间 movl 8(%ebp), %eax movl 12(%ebp), %ebx addl %ebx, %eax call L_0L_0: popl %ebx lea L_str-L_0(%ebx), %ebx movl %ebx, (%esp) movl %eax, 4(%esp) call _printf movl %ebp, %esp popl %ebp ret .cstringL_str: .asciz "sum = %d\n" .text .globl _main .p2align 4, 0x90_main: pushl %ebp movl %esp, %ebp subl $40, %esp movl $2, (%esp) movl $3, 4(%esp) call _add_and_print movl %ebp, %esp popl %ebp ret
这里printf函数对应frame 0栈帧
它的输入参数是add_and_print函数通过esp间接寻址设置的
add_and_print函数的输入参数是通过ebp间接寻址获取的
subl $40, %esp
该指令为函数扩大栈帧空间,为函数内部可能的局部变量预留空间,以及为下一个要调用的函数的参数预留空间,局部变量从栈帧开始处向下存储,下一个要调用的函数的参数是从栈顶处向上存储,如下图所以:
阅读全文
0 0
- ia-32 C语言栈帧布局
- IA-32结构c语言描述
- IA-32
- IA-32
- C语言内存布局
- C语言内存布局
- C语言内存布局
- C语言内存布局
- C语言内存布局
- C语言内存布局
- IA 64 and IA-32 MTRRs
- IA-32寄存器
- IA-32汇编知识
- IA-32操作模式
- IA-32 Debug寄存器
- IA-32 汇编
- ia-32汇编笔记
- IA-32寄存器
- 数学建模--数理统计
- BZOJ 2038 小Z的袜子(hose) (莫队算法入门题)
- knn
- Redis学习
- 重温python基础4:列表
- ia-32 C语言栈帧布局
- 请好好规划你的人生和未来
- python中json.dumps()/loads()/dump()/load()使用
- R随机数
- PAT --- 1004. 成绩排名 (20)
- hbase中分页过滤器详细解析
- RN开发实践——仿携程App(二)
- 7分钟 unity oculus VR游戏开发
- 07.27.17