gpt4 book ai didi

c - C 和汇编器中的阶乘 - 递归

转载 作者:行者123 更新时间:2023-11-30 19:32:02 25 4
gpt4 key购买 nike

我编写了在汇编器中计算阶乘的算法。我是汇编初学者,如果这个算法好的话,我希望得到你的建议。

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

最佳答案

递归函数必须调用自身。我看到你在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) > 可以使用寄存器,这取决于使用的优化标志)。

关于c - C 和汇编器中的阶乘 - 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47539888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com