计算n!在x86程序集中不使用乘法?

时间:2014-02-02 00:52:47

标签: assembly x86 x86-64

我正在努力计算n!在x86程序集中没有使用乘法(我知道它是愚蠢但它测试我在寄存器中存储和操作数据的能力)。我被告知你可以通过没有太多的装配线来做到这一点。

我知道那个! = n *(n-1)!所以,如果我需要计算5!我可以加4! 5次(5!= 4!+ 4!+ 4!+ 4!+ 4!)。从那里我只需要计算4!同样的方式一直到2! = 1! + 1!和1! = 1。

我的第一个想法是使用循环

mov eax, 0 ; clear eax
mov ecx, n ; because ecx is the loop counter
next:
    add eax, (n-1)! ; illegal 
loop next

我假设程序集不会让你在像

这样的循环中进行递归调用
next:
   dec edx ; decrement
   add eax, call nfact;
loop next

edx将数字存储为阶乘。

我很困惑如何正确地执行嵌套循环,以便不破坏我需要的任何数据并仍然得到结果。

编辑:

以下是我如何计算乘法重复加法:

;calulate A*B

mov eax, a ;
mov ecx, b ;
mov ebx, 0 ; this will store a*b
next:
add ebx, eax;
loop next ; ecx is the loop counter that the loop instruction decrements

;;now ebx has the value a*b;

1 个答案:

答案 0 :(得分:0)

第1步:cmp edx,MAXja .tooLarge;其中MAX是n的最大值,其中n!适合32位

第2步:执行mov eax,[lookupTable + edx * 4]

这是3条指令。查找表根本不会很大,可以很容易地预先计算并存储为数据(例如lookupTables dd 0,1,2,...