程序原理之_函数调用栈2

本文通过一个简单的C语言代码示例,展示了函数之间的嵌套调用,并详细解释了对应的汇编代码。在汇编代码中,可以看到函数调用的过程,包括参数传递、栈帧建立、调用与返回指令。通过对`enter`、`leave`、`call`和`ret`等关键指令的解析,深入理解函数调用的底层运作机制。
摘要由CSDN通过智能技术生成

写一段简单的c代码,表征函数之间的嵌套调用,如下:

#include <stdio.h>
int g(int x)
{
  return x + 3;
}

int f(int x)
{
  return g(x);
}

int main(void)
{
  return f(8) + 1; 
}

用如下gcc编译命令进行编译:

gcc -S -o helloworld.s helloworld.c -m32     // -m32指按照32位汇编指令编码

得到的汇编代码如下(删除了跟具体指令无关的文本):

g:
    pushl    %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $3, %eax
    popl    %ebp
    ret

f:
    pushl    %ebp
    movl    %esp, %ebp
        subl    $4, %esp
        movl    8(%ebp), %eax
        movl    %eax, (%esp)
        call    g
        leave
        ret

main:
    pushl    %ebp               
    movl    %esp, %ebp         
        subl    $4, %esp           
        movl    $8, %esp           
    call    f                  
    addl    $1, %eax
        leave
    ret

其中一些特殊指令解释如下:

enter:
    pushl %ebp
    movl %esp, %ebp
leave:
    movl %ebp, %esp
    popl %ebp
call:
    pushl %eip
    movl f, %eip
ret:
    popl %eip

完整的栈调用流程整理成如下表格:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值