我编写的算法在汇编程序中计算阶乘。我是汇编程序的初学者,如果这个算法很好的话,我想给你一些建议。
unsigned long int k = 12;
unsigned long int result = 1;
unsigned long factorial = k;
unsigned long int C_recursion(unsigned int k){
if (k < 2)
return 1;
return k*C_recursion(k - 1);}
int ASM_recursion(unsigned long int k, unsigned long int result){
__asm {
xor eax, eax
xor ebx, ebx
mov eax, k
mov ebx, factorial
if :
cmp factorial, 2
jge recursion
jmp end
recursion :
dec factorial
mul factorial
jmp if
end :
mov result, eax
}
return result;}
嗯,一切正常但老实说我不知道这个汇编程序代码是否真的是递归。我在Visual Studio中编写它。
答案 0 :(得分:0)
递归函数必须调用自身。我看到你写的是32位,你可以试试这个
int factorial (int n)
{
__asm {
cmp n,0
je return1 // n == 0, return 1
mov ecx,n
sub ecx,1
push ecx // ecx == n-1
call factorial
add esp,4 // pop (n) argument from stack
imul eax,n // n * factorial(n-1)
jmp return2
return1:
mov eax,1
return2:
}
}
行jmp return2
非常重要,你不能在那里插入ret
指令,因为编译器可能会添加一些指令来构建帧堆栈(ebp
寄存器可能会被使用,这取决于优化使用的标志)。