C x86汇编语言中的递归函数

C x86汇编语言中的递归函数,c,assembly,recursion,x86,C,Assembly,Recursion,X86,我在x86汇编代码中有一个methodint 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 )

我在x86汇编代码中有一个methodint 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
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
}
但我就是不能理解它的功能

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

%eax初始化为1

如果%edx不是0,我将从%edx中减去1,并将%edx和%ebx推送到堆栈上,然后再次调用该方法。我只是不明白它是干什么的。难道不可能到达imull%ebx,%eax这条线吗

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

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

该函数似乎通过递归计算输入变量ab的幂,该值通过%eax返回


其工作方式是,基本情况是b为0,返回1。当b>0时,返回methoda,b-1*a。

基本上相当于以下C函数:

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

  return method(a, b-1) * a;  
}
或更接近汇编代码:

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
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
}

好的,如果b=0,它只返回%eax,即1。如果不是0,则计算a^b。但为什么它要将%ebx与%eax相乘?它不能通过movl将结果写入%eax吗?@mind-它不计算a*b,而是计算ab。因此,它将%eax中的中间结果乘以%ebx b。