x86-assembly中的递归函数

时间:2016-01-19 19:04:46

标签: c assembly recursion x86

我在x86汇编代码中有一个方法method(int a, int b)

method:
  pushl  %ebx
  subl   $24 , %esp
  movl   32(%esp ) , %ebx
  movl   36(%esp ) , %edx
  movl   $1 , %eax
  testl  %edx , %edx
  je     .L2
  subl   $1 , %edx
  movl   %edx , 4(%esp )
  movl   %ebx , (%esp )
  call   method
  imull  %ebx , %eax
.L2:
  addl   $24 , %esp
  popl   %ebx
  ret

但我无法绕过它的功能。

a写在%ebx上,b写在%edx上。

%eax初始化为1。

如果%edx不为0,我会从%edx中减去1并在堆栈上推送%edx%ebx,然后再次调用method。我只是不明白它的作用。是不是无法到达imull %ebx, %eax行?

如果有人能向我解释这种方法的基本功能,我会非常高兴。

2 个答案:

答案 0 :(得分:2)

imull %ebx, %eax在递归调用返回时到达。

该函数似乎是通过递归计算输入变量(a b )的功效,并通过%eax返回值。

这种方法的工作方式是基本情况是b为0时,返回1。当b> 0,返回method(a, b-1) * a

答案 1 :(得分:2)

它基本上等同于以下C函数:

int method(int a, int b)
{
  if (b == 0)
    return 1;

  return method(a, b-1) * a;  
}

或更接近汇编代码:

int method(int a, int b)
{
  if (b == 0)
    return 1;

  int temp = method(a, b-1);

  return temp * a;  // we do get here when the recursion is over,
                    // the same ways as we get to imull %ebx, %eax
                    // in your assembly code when the recursion is over
}