您的位置:首页 > 其它

x86 子函数调用过程分析

2016-02-25 00:02 134 查看

name:罗雄

原创作品转载请注明出处

课程:《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)老“码”识途从机器码到框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: