急! 关于GCC生成的汇编代码
include <stdio.h>
int fun(b)
int b;
{
printf("%d",b);
return(0);
}
int main(){
int a=0;
fun(a);
printf("OK!");
return(0);
}
编译之后的汇编代码:
.file "ex01.c"
.version "01.01"
gcc2_compiled.:
.section .rodata
.LC0:
.string "%d" //什么意思
.text
.align 16 //什么意思
.globl fun
.type fun,@function //什么意思
fun:
pushl %ebp
movl %esp, %ebp
subl $8, %esp //为什么在每个调用处都要空出这个空间来,这个空间事实上好像并没有存放任何东西?
subl $8, %esp //问题同上。
pushl 8(%ebp)
pushl $.LC0
call printf
addl $16, %esp
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret
.Lfe1:
.size fun,.Lfe1-fun
.section .rodata
.LC1:
.string "OK!"
.text
.align 16
.globl main
.type main,@function
main:
pushl %ebp //此处的bp是进入主程序时的bp,那么在进入主程序之前,这个bp保存了什么呢?
movl %esp, %ebp //这一句的意思是说以后的参数都通过bp间接地使用堆栈来存取吗?
subl $8, %esp //为什么主程序这个地方要空出一个空间来?
movl $0, -4(%ebp) //这一句的意思是说保存那个参数a的值到bp-4的单元处吗?
subl $12, %esp //为什么继上面的空出8个单元后,又接着要空出12个单元?作用是什么?
pushl -4(%ebp)
call fun //上面的push压入了参数,但在fun中是如何引用的呢?call时都执行了什么步骤呢?
addl $16, %esp
subl $12, %esp //问题同上:此处为何也空出这些单元来?
pushl $.LC1
call printf
addl $16, %esp
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret
.Lfe2:
.size main,.Lfe2-main
.ident "GCC: (GNU) 2.96 20000731 (Mandrake Linux 8.1 2.96-0.62mdk)"
其中的bp(分两种情况:主程序与子程序)的作用,含义;还有“每次的sub,空出一块空间来”是何用意?再有fun是如何引用参数的。
期待好心人的点拨