(gdb) disas func4
Dump of assembler code for function func4:
0x08048dcb <+0>: push %esi
0x08048dcc <+1>: push %ebx
0x08048dcd <+2>: sub $0x14,%esp
0x08048dd0 <+5>: mov 0x20(%esp),%edx
0x08048dd4 <+9>: mov 0x24(%esp),%eax
0x08048dd8 <+13>: mov 0x28(%esp),%ebx
0x08048ddc <+17>: mov %ebx,%ecx
0x08048dde <+19>: sub %eax,%ecx
0x08048de0 <+21>: mov %ecx,%esi
0x08048de2 <+23>: shr $0x1f,%esi
0x08048de5 <+26>: add %esi,%ecx
0x08048de7 <+28>: sar %ecx
0x08048de9 <+30>: add %eax,%ecx
0x08048deb <+32>: cmp %edx,%ecx
0x08048ded <+34>: jle 0x8048e06
0x08048def <+36>: sub $0x1,%ecx
0x08048df2 <+39>: mov %ecx,0x8(%esp)
0x08048df6 <+43>: mov %eax,0x4(%esp)
0x08048dfa <+47>: mov %edx,(%esp)
0x08048dfd <+50>: call 0x8048dcb
0x08048e02 <+55>: add %eax,%eax
0x08048e04 <+57>: jmp 0x8048e26
0x08048e06 <+59>: mov $0x0,%eax
0x08048e0b <+64>: cmp %edx,%ecx
0x08048e0d <+66>: jge 0x8048e26
0x08048e0f <+68>: mov %ebx,0x8(%esp)
0x08048e13 <+72>: add $0x1,%ecx
0x08048e16 <+75>: mov %ecx,0x4(%esp)
0x08048e1a <+79>: mov %edx,(%esp)
0x08048e1d <+82>: call 0x8048dcb
0x08048e22 <+87>: lea 0x1(%eax,%eax,1),%eax
0x08048e26 <+91>: add $0x14,%esp
0x08048e29 <+94>: pop %ebx
0x08048e2a <+95>: pop %esi
0x08048e2b <+96>: ret
基本上都是一些算数运算,自己调试下就可以了。