汇编帧栈
2017-04-05 20:27:12 0 举报
汇编帧栈是一种用于存储程序运行时数据的数据结构,它遵循先进后出(FILO)的原则。在汇编语言中,程序员通过操作寄存器和内存来实现对帧栈的操作。帧栈通常用于函数调用、局部变量存储以及返回地址的管理。当一个函数被调用时,它的参数和局部变量会被压入帧栈中,同时保存当前的返回地址。当函数执行完毕并返回时,之前压入的参数和局部变量会依次从帧栈中弹出,同时恢复之前的返回地址。这种机制使得函数调用过程中的上下文信息得以保留,从而实现了函数的嵌套调用和递归。
作者其他创作
大纲/内容
0x100000f4
被调用者保存寄存器
0x23
2
寄存器保存
0x100000dc
值说明
上一帧的起始地址
ret
%rsp状态
0x100000e4
%esp-4=0x9840x984=%ebp=0x992
帧指针
寄存器
值
1
0x100000fc
0x20001002
%eax
临时变量
0x100000e0
根据情况分配
...(func2内的指令2)
被调用者的参数
0x33
%ebp=0x992
0x20001003
push %ebp
...(func2内的指令1)
栈帧指针状态
0x20001000
0x100000e8
0x32
指令行内存地址
继续计算calculate
0x100000d8
...
0x25
0x988
一些计算calculate
使用惯例
0x26
0x100000d4
0x984
leave
0x21
0x5
流水线跳到[0x988]=0x25%esp+4=0x992
0x100000ec
返回地址(指令)
0x10000000
0x100000f8
0x100000cc
%edx
0x6
0x7
0x20000000
流水线跳到[0x996]=0x5%esp+4=0x1000
0x100000f0
0x34
0x100000d0
局部变量
内存地址
0x20002000
0x10000100
0x1
push $2
%esi
0x2
0x31
栈空间地址
0x20000010
0x3
%ebp=0x1000
0x996
指令流
帧func2
%ebp
0x35
0x10002003
%esp-4=0x9960x996=0x5流水线jump to 0x21
0x...
%edi
0x22
栈指针
call func1
调用函数 call f1
指令(假设都16位长)
0x10002002
0x4
调用者保存寄存器
功能
调用func2()时分配
0x20001004
0x20002001
0x20001001
汇编指令行
%ebx
...(func1内的指令2)
调用函数 call f2
分配时机
保存函数返回值
指令行内存地址实际执行顺序
%ebp=0x984
指令内存地址
0x992
调用func1()时分配
call func2
帧func1
栈帧
0x1000
%ecx
0x24
汇编指令行实际执行顺序
...(func1内的指令1)
%esp-4=0x9880x988=0x25流水线jump to 0x31
%esp
%esp-4=0x9920x992=%ebp=0x1000
0 条评论
下一页