阶乘 - C和汇编程序中的递归

时间:2017-11-28 19:56:11

标签: c recursion assembly x86

我编写的算法在汇编程序中计算阶乘。我是汇编程序的初学者,如果这个算法很好的话,我想给你一些建议。

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中编写它。

1 个答案:

答案 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寄存器可能会被使用,这取决于优化使用的标志)。