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代码
x86 子函数调用过程分析_第1张图片

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”
x86 子函数调用过程分析_第2张图片

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

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

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

推荐图书:

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

你可能感兴趣的:(MOOC)