新手汇编一个递归不太懂,有大佬能用C语言解释一下吗

CalvinXu17 2018-12-04 08:20:30
08048c83 <func4>: 8048c83: 55 push %ebp 8048c84: 89 e5 mov %esp,%ebp 8048c86: 57 push %edi 8048c87: 56 push %esi 8048c88: 53 push %ebx 8048c89: 83 ec 0c sub $0xc,%esp 8048c8c: 8b 5d 08 mov 0x8(%ebp),%ebx 8048c8f: 8b 7d 0c mov 0xc(%ebp),%edi 8048c92: 85 db test %ebx,%ebx 8048c94: 7e 2b jle 8048cc1 <func4+0x3e> 8048c96: 89 f8 mov %edi,%eax 8048c98: 83 fb 01 cmp $0x1,%ebx 8048c9b: 74 29 je 8048cc6 <func4+0x43> 8048c9d: 83 ec 08 sub $0x8,%esp 8048ca0: 57 push %edi b 8048ca1: 8d 43 ff lea -0x1(%ebx),%eax 8048ca4: 50 push %eax 8048ca5: e8 d9 ff ff ff call 8048c83 <func4> 8048caa: 83 c4 08 add $0x8,%esp 8048cad: 8d 34 07 lea (%edi,%eax,1),%esi 8048cb0: 57 push %edi 8048cb1: 83 eb 02 sub $0x2,%ebx 8048cb4: 53 push %ebx 8048cb5: e8 c9 ff ff ff call 8048c83 <func4> 8048cba: 83 c4 10 add $0x10,%esp 8048cbd: 01 f0 add %esi,%eax 8048cbf: eb 05 jmp 8048cc6 <func4+0x43> 8048cc1: b8 00 00 00 00 mov $0x0,%eax 8048cc6: 8d 65 f4 lea -0xc(%ebp),%esp 8048cc9: 5b pop %ebx 8048cca: 5e pop %esi 8048ccb: 5f pop %edi 8048ccc: 5d pop %ebp 8048ccd: c3 ret
...全文
794 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 CalvinXu17 的回复:
引用 3 楼 早打大打打核战争 的回复:
呃,错了,应该是// lea esi,[edi*1+eax]
最后return的应该是func(i-1,j)+j+func(i-2,j)吧?


对。这其实就是变形的fibonacci数列求和
  • 打赏
  • 举报
回复
呃,错了,应该是// lea esi,[edi*1+eax]
  • 打赏
  • 举报
回复
lea (%edi,%eax,1),%esi 这个理解错了
这其实是lea esi,[edi+eax] // lea esi,[edi+eax*1]
zara 2018-12-05
  • 打赏
  • 举报
回复
好像是这个样子:
int  func4(int i, int j)
{
if (i <=0 ) return 0;
if (i == 1) return j;

return (func4(i-1,j)+j+1 + func4(i-2,j));

} // end of func4()

 08048c83 <func4>:						; func4(i, j)
8048c83: 55 push %ebp
8048c84: 89 e5 mov %esp,%ebp
8048c86: 57 push %edi
8048c87: 56 push %esi
8048c88: 53 push %ebx
8048c89: 83 ec 0c sub $0xc,%esp
8048c8c: 8b 5d 08 mov 0x8(%ebp),%ebx ; i
8048c8f: 8b 7d 0c mov 0xc(%ebp),%edi ; j
8048c92: 85 db test %ebx,%ebx ; i
8048c94: 7e 2b jle 8048cc1 <func4+0x3e> ; i <=0 go to return 0
8048c96: 89 f8 mov %edi,%eax ; j
8048c98: 83 fb 01 cmp $0x1,%ebx ; i ? 1
8048c9b: 74 29 je 8048cc6 <func4+0x43> ; i == 1 go to return j
8048c9d: 83 ec 08 sub $0x8,%esp
8048ca0: 57 push %edi b ; j
8048ca1: 8d 43 ff lea -0x1(%ebx),%eax ; i - 1
8048ca4: 50 push %eax
8048ca5: e8 d9 ff ff ff call 8048c83 <func4> ; func4(i-1, j)
8048caa: 83 c4 08 add $0x8,%esp
8048cad: 8d 34 07 lea (%edi,%eax,1),%esi ; fun4(i-1,j) + j+1 -> esi
8048cb0: 57 push %edi ; j
8048cb1: 83 eb 02 sub $0x2,%ebx ; i - 2
8048cb4: 53 push %ebx
8048cb5: e8 c9 ff ff ff call 8048c83 <func4> ; func4(i-2, j)
8048cba: 83 c4 10 add $0x10,%esp
8048cbd: 01 f0 add %esi,%eax ; func4(i-2, j) + func4(i-1, j)+j+1 -> eax
8048cbf: eb 05 jmp 8048cc6 <func4+0x43> ; retrun eax ^
8048cc1: b8 00 00 00 00 mov $0x0,%eax
8048cc6: 8d 65 f4 lea -0xc(%ebp),%esp
8048cc9: 5b pop %ebx
8048cca: 5e pop %esi
8048ccb: 5f pop %edi
8048ccc: 5d pop %ebp
8048ccd: c3 ret
CalvinXu17 2018-12-05
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
呃,错了,应该是// lea esi,[edi*1+eax]
最后return的应该是func(i-1,j)+j+func(i-2,j)吧?
CalvinXu17 2018-12-05
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
呃,错了,应该是// lea esi,[edi*1+eax]
CalvinXu17 2018-12-05
  • 打赏
  • 举报
回复
谢谢谢谢

21,458

社区成员

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

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