我在这里遇到了问题 我需要创建一个带有预设数字(保存在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
答案 0 :(得分:1)
好吧,因为可存储在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