アセンブリ言語で書かれた関数をC言語に書き直す
以下のアセンブリ言語で書かれた関数をC言語風に書き直したいです。
関数内で同じ関数を呼び出しているので再帰処理をしているところまでは分かるのですが、再帰を抜け出す条件と再帰内で何を計算しているのかが分かりません。
どなたか教えていただけないでしょうか。
/* <+0> ~ <+9> 再帰の終了条件 */
0x00000000004010ac <+0>: test %edi,%edi
0x00000000004010ae <+2>: jle 0x4010db <func4+47> /* もしedi<=0なら再帰終了*/
0x00000000004010b0 <+4>: mov %esi,%eax
0x00000000004010b2 <+6>: cmp $0x1,%edi
0x00000000004010b5 <+9>: je 0x4010e5 <func4+57> /* もしedi=1なら再帰終了, 戻り値はARG2(%eax) */
/* <+11> ~ <+14> で呼出先退避レジスタの値をスタックに退避 */
0x00000000004010b7 <+11>: push %r12
0x00000000004010b9 <+13>: push %rbp
0x00000000004010ba <+14>: push %rbx /* <+11> ~ <+14>
/* <+15> ~ <+17> 引数の値を破壊されないよう安全なレジスタへ退避する
0x00000000004010bb <+15>: mov %esi,%ebp /* ARG2 */
0x00000000004010bd <+17>: mov %edi,%ebx /* ARG1 */
/* <+19> ~ <+22> func4(ARG1-1, ARG2)で再帰呼出
0x00000000004010bf <+19>: lea -0x1(%rdi),%edi /* ARG1=%rdi(ARG1)-1 */
0x00000000004010c2 <+22>: callq 0x4010ac <func4>
/* <+27> %r12d=func4一回目の戻り値*1+ARG2+0 */
0x00000000004010c7 <+27>: lea 0x0(%rbp,%rax,1),%r12d
/* <+32> ~ <+35> func4(ARG1-2, ARG2)で再帰呼出 */
0x00000000004010cc <+32>: lea -0x2(%rbx),%edi /* ARG1=%rbx(ARG1)-2 */
0x00000000004010cf <+35>: mov %ebp,%esi /* ARG2 */
0x00000000004010d1 <+37>: callq 0x4010ac <func4>
/* <+42> 戻り値=(func4一回目の戻り値*1+ARG2+0)+ARG2 */
0x00000000004010d6 <+42>: add %r12d,%eax
0x00000000004010d9 <+45>: jmp 0x4010e1 <func4+53>
/* <+47> ~ <+52> edi<=0の時に0をreturn
0x00000000004010db <+47>: mov $0x0,%eax
0x00000000004010e0 <+52>: retq
/* <+53> ~ <+55> 退避した呼出先退避レジスタの値をスタックから回収 */
0x00000000004010e1 <+53>: pop %rbx
0x00000000004010e2 <+54>: pop %rbp
0x00000000004010e3 <+55>: pop %r12
0x00000000004010e5 <+57>: repz retq