x86 子函数调用过程分析

课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

工作系统:深度操作系统 15.1
工作环境: gcc version 5.3.1 20160114 (Debian 5.3.1-6)
GNU gdb (Debian 7.10-1+b1) 7.10

1)c代码:

/**
 * Author: lxhuster
 * Abstract: 
 */

 int foo( int x)
 {
    return (x + 2);
 }

 void main()
 {
    foo(5);
 }

2)编译C代码
这里写图片描述

3)对应汇编代码:

    .file   "main.c"

main:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   $5
    call    foo
    addl    $4, %esp
    nop
    leave
    ret

foo:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $2, %eax
    popl    %ebp
    ret

4)foo函数调用过程分析:
main函数通过栈传递参数“5”
这里写图片描述

总结:通过分析函数调用过程,

        1)可以发现x86默认情况下使用的减满栈的堆栈生长方案。
        2)在汇编代码中movl    8(%ebp), %eax之类访问%ebp指向地址之上的操作多半是在读取传入参数,
                反之,读取%ebp指向地址之下的操作就是在操作局部变量。

疑问:恩,为什么x86木有使用寄存器来传递函数调用参数?

推荐图书:

1)深入理解计算机体系结构
2)老“码”识途从机器码到框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值