我在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
行?
如果有人能向我解释这种方法的基本功能,我会非常高兴。
答案 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
}