汇编语言栈帧的理解
函数栈由三部分组成: setup, Body, Finish
%ebp 保存栈帧的起始地址, ebp指向栈帧起始地址
%esp 保存栈帧的栈顶地址, esp指向栈顶
所以栈的空间就是 esp-ebp
案例:
swap函数栈:
swap: #setup部分
pushl %ebp
movl %esp, %ebp
pushl %ebx
解释:
swap:
(1)pushl %ebp #将ebp保存的旧ebp地址压栈, 由于esp始终指向栈顶,
#所以esp指向刚压进栈的旧ebp地址空间
(2)movl %esp, %ebp #将esp保存的栈顶地址, 传送给ebp寄存器, 所以ebp寄存器指向esp所指向的位置, 也就是栈顶
(3)pushl %ebx #将ebx 压栈
!!!注意坑点: esp寄存器在汇编语言中永远是指向栈顶的
执行过程:
(1)pushl %ebp
#第一步: 初始状态下, 将ebp保存的地址压栈
#第二步: !!!注意, 坑点!!!, 执行pushl %ebp 后esp寄存器就指向了这个新的地址空间, esp永远指向栈顶!!!!
(2)movl %esp, %ebp
#注意: 这里很重要!!!
#将esp保存的栈顶地址, 传送给ebp寄存器,
#所以此时ebp寄存器指向esp所指向的栈顶位置
(3)pushl %ebx #将ebx 压栈
....未完待续....