我正在努力计算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;
答案 0 :(得分:0)
第1步:cmp edx,MAX
和ja .tooLarge
;其中MAX是n的最大值,其中n!适合32位
第2步:执行mov eax,[lookupTable + edx * 4]
这是3条指令。查找表根本不会很大,可以很容易地预先计算并存储为数据(例如lookupTables dd 0,1,2,...
)