/********************************************* TEXT: C程序的机器级表示
AUTHOR: arden chao
DATE: 2006-10-17
EMAIL: arden1019@gmail.com
VERSION:1.0.0
\*********************************************/
////////////////////////////////
//2006-10-23 函数的内存空间<1>
////////////////////////////////
前提知识点:little-endian和big-endian 、%esp\%ebp寄存器。
我们先来对C程序的内存布局做一下了解。这里我们引用《APUE》中的一些内容阐述:
一般,C程序由下面部分组成。
+正文段:CPU执行的机器码部分。
+初始化数据段:程序中所需赋初值的变量。
+非初始化数据段bss:程序开始之前,一些不需要初始化的变量。
+栈:自动变量、函数调用时所需要保存的信息。
+堆:动态分配的内存。
|----------------|
高地址 | | 命令行参数、环境变量
|----------------|
| 栈(向下) |
|----------------|
| |
| |
| |
| |
|----------------|
| 堆(向上) |
|----------------|
|未初始化数据|
|----------------|
| 初始化变量 |
|----------------|
| |
| 正文 |
低地址 |----------------|
我们把实现集中在函数栈上面。
这次我们给一个健全点的程序,它拥有著名的main程序入口点及一个函数fun:
int fun(int a,int b)
{
int localvar=a;
b=10;
return 1;
}
int main()
{
int i;
i=fun(20,30);
return i;
}
顺便把汇编码写出来,尝试读明白其中的代码:
// command : gcc -S asm02.c
.file "asm02.c"
.text
.globl _fun
.def _fun; .scl 2; .type 32; .endef
_fun:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, -4(%ebp)
movl $10, 12(%ebp)
movl $1, %eax
leave
ret
.def ___main; .scl 2; .type 32; .endef
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
movl $30, 4(%esp)
movl $20, (%esp)
call _fun
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
leave
ret