简单汇编问题

davidchen1219 2003-01-12 08:27:23
一个小程序在linux系统下生成的汇编代码,哪位给具体解释一下,感谢!
func(i)
long i;
{
long j;
j=i-1;
func(j);
}

产生的汇编代码:
.........
........
_func:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl 8(%ebp),%edx
decl %edx
movl %edx,-4(%ebp)
movl -4(%ebp),%eax
push %eax
call _func
addl $4,%esp
L1:
leave
ret
Lfel:
.size _func,Lfel-_func


...全文
32 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
teal 2003-01-13
  • 打赏
  • 举报
回复
L1:
leave
ret
Lfel:
.size _func,Lfel-_func

编译器随机生成的
L1: 标志程序的结束
Lfel: 附加标志
.size _func,Lfel-_func
计算 _func 函数的大小
其中 Lfel 是Lfel在程序中所指的位置(程序短的结尾),_func程序的开始位置 ,两者之差,程序的大小
davidchen1219 2003-01-13
  • 打赏
  • 举报
回复
to jfguo(jfguo):thanks
bp是基址指针,sp是栈顶指针.“-”是往低地址方向移动,空间变大.
"+"就相反.
ebp是8个字节么,我觉得应该是4个字节,还有一个4字节的返回地址.

davidchen1219 2003-01-13
  • 打赏
  • 举报
回复
其他代码能看懂
不明白的是这个标志 L1,Lfel怎么来的,编译器随机生成的?
还有这个.size指令具体是什么操作的.
jfguo 2003-01-13
  • 打赏
  • 举报
回复
从汇编代码可以推出以下几点:esb是堆栈的栈顶指针,ebp长度是8字节,
+esb是退栈操作,而-esb使栈空间增大,堆栈栈顶最初为i
有着几点就可以知道下面代码的意思

_func:
pushl %ebp //保存ebp的旧值
movl %esp,%ebp //ebp = esp
subl $4,%esp //栈空间加大4Byte, 为j分配空间
movl 8(%ebp),%edx //ebp+8的位置为i, edx = i
decl %edx // edx--, i-1
movl %edx,-4(%ebp) //-4(ebp)为j, j = i-1
movl -4(%ebp),%eax // eax = j
push %eax // 将j压栈
call _func
addl $4,%esp
L1:
leave
ret
Lfel:
.size _func,Lfel-_func

cache2002 2003-01-13
  • 打赏
  • 举报
回复
学习一下,
jfguo 2003-01-13
  • 打赏
  • 举报
回复
o, ebp应该是4byte, 我忘考虑返回地址了
sjd163 2003-01-12
  • 打赏
  • 举报
回复
怎么生的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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