课程:《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)老“码”识途从机器码到框架