我这里有个问题。
我需要创建一个循环,它接受一个预先设置的数字(保存在ebx中)并计算它的阶乘,但对于我来说,我不知道怎么做。我的限制因素是你不能使用任何乘法命令。
以下是问题的基本格式:
;preceding code
mov eax, 0 ;n! will be stored in eax
ecx = ebx ;ebx = n
factorial: ;computes n!
;some algorithm I have not figured out
;
;
loop factorial
;eax = n!你对这个算法有什么想法吗?
更新:我找到了这个算法,我必须用C编写它,因为我在这方面比x86汇编要流利得多。
int x = z; //z is the number we want z! from
int y = 0;
int n = x;
int i, j;
for(i = x - 1; i > 0; i--)
{
for(j = n; j > 0; j--)
y += i;
n = y;
y = 0;
}
printf("%d\n", n);当前正在尝试转换为程序集。
这是所有未来程序员的最终翻译/答案。问题解决了。
;FACTORIAL WITHOUT MULTIPLICATION
mov ecx, ebx
mov edx, 0
mov eax, ebx
dec ecx
jz next
factorial:
mov edi, ecx
mov ecx, eax
factorial2:
add edx, edi
loop factorial2
mov ecx, edi
mov eax, edx
mov edx, 0
loop factorial 发布于 2014-01-31 07:46:20
嗯,因为可以存储在32位整数中的最大阶乘是12!不需要使用循环。只将阶乘存储在表中并查找它们会更容易、更快。
不带范围检查的代码可能如下所示:
; assumes n is stored in EBX
lea edi, [FactorialTable]
mov eax, [edi + ebx*4]
ret ; return from subroutine
FactorialTable:
dd 1 ; factorial of 0 is 1
dd 1
dd 2
dd 6
dd 24
dd 120
dd 720
dd 5040
dd 40320
dd 362880
dd 3628800
dd 39916800
dd 479001600https://stackoverflow.com/questions/21469692
复制相似问题