ia-32 C语言栈帧布局

栈指针栈内容ebp间接寻址
frame 1old ebp value
local variable 1
local variable 2
local variable 3
arg212(%ebp)
arg18(%ebp)
ret addr4(%ebp)
frame 0old ebp value(%ebp)
local variable 1-4(%ebp)
local variable 2-8(%ebp)
arg24(%esp)
esp ->arg1(%esp)

说明

  • esp总是指向栈顶

  • ebp指向的位置开启一个新栈帧
    所以ebp又称为stack frame pointer

  • ebp往上的栈帧是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_0
L_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

    .cstring
L_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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值