MASM X86组装迭代添加以评估阶乘



我在这里有问题。
我需要创建一个单个循环,该循环采用预设编号(保存在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

最新更新