C x86汇编语言中的递归函数
我在x86汇编代码中有一个methodint a,int b方法: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 )
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。