我在这里有问题。
我需要创建一个单个循环,该循环采用预设编号(保存在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("%dn", 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
好吧,因为可以存储在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 479001600