首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MASM x86组件迭代加法计算阶乘

MASM x86组件迭代加法计算阶乘
EN

Stack Overflow用户
提问于 2014-01-31 07:31:24
回答 1查看 1K关注 0票数 0

我这里有个问题。

我需要创建一个循环,它接受一个预先设置的数字(保存在ebx中)并计算它的阶乘,但对于我来说,我不知道怎么做。我的限制因素是你不能使用任何乘法命令。

以下是问题的基本格式:

代码语言:javascript
复制
;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汇编要流利得多。

代码语言:javascript
复制
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);

当前正在尝试转换为程序集。

这是所有未来程序员的最终翻译/答案。问题解决了。

代码语言:javascript
复制
;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  
EN

回答 1

Stack Overflow用户

发布于 2014-01-31 07:46:20

嗯,因为可以存储在32位整数中的最大阶乘是12!不需要使用循环。只将阶乘存储在表中并查找它们会更容易、更快。

不带范围检查的代码可能如下所示:

代码语言:javascript
复制
  ; 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21469692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档