急! 关于GCC生成的汇编代码

Fluxray 2003-12-04 01:43:50
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是如何引用参数的。
期待好心人的点拨
...全文
93 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fluxray 2003-12-05
  • 打赏
  • 举报
回复
<a href="www.163.com">hjj</a>
reayi 2003-12-04
  • 打赏
  • 举报
回复
.string "%d" //什么意思:字符串变量
.align 16 //什么意思:16字节对齐

.type  fun,@function //什么意思:指明fun是函数类型
subl $8, %esp    //为什么在每个调用处都要空出这个空间来,这个空间事实上好像并没有存放任何东西?:这个可能跟编译器的优化有关,实际上有的优化是多余的
pushl %ebp    //此处的bp是进入主程序时的bp,那么在进入主程序之前,这个bp保存了什么呢?:下面就要用到ebp,所以要保存起来,标准过程调用的格式。
movl %esp, %ebp  //这一句的意思是说以后的参数都通过bp间接地使用堆栈来存取吗?ebp主要用来获取函数调用传来的参数或设置函数调用的参数,因为esp是一直再变得

pushl -4(%ebp)
call fun     //上面的push压入了参数,但在fun中是如何引用的呢?call时都执行了什么步骤呢?
再fun中引用如下:
pushl 8(%ebp) -->就是上面主程序压入的参数
pushl $.LC0 --》"%d"
call printf
zongta 2003-12-04
  • 打赏
  • 举报
回复
看看Linux 下的 as 汇编器 的参考手册,我想关于汇编规则和语法的问题都能找到答案。
紫郢剑侠 2003-12-04
  • 打赏
  • 举报
回复
GCC?

没用过.

关注

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧