MASM x86汇编迭代加法评估因子

时间:2014-01-30 23:31:24

标签: assembly x86 masm factorial

我在这里遇到了问题 我需要创建一个带有预设数字(保存在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);

目前正在尝试翻译成大会。

HERE是所有未来编码员的最终翻译/答案。问题解决了。

;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  

1 个答案:

答案 0 :(得分:1)

好吧,因为可存储在32位整数中的最大因子是1​​2!不需要使用循环。将阶乘存储在表中并进行查找会更加容易和快捷。

没有范围检查的代码可能有点像这样:

  ; 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