Некоторые замечания после раскомментирования fact и ~
если операнд отрицательный, то факториал для него не существует, а ты анализ знака операнда нигде не делаешь
Код:
: fact DUP 2 < IF DROP 1 ELSE 1 SWAP 1+ 1 ?DO I * LOOP THEN ;
-5 fact ( 1 )
CODE fact
591F20 8945FC MOV FC [EBP] , EAX
591F23 8945F8 MOV F8 [EBP] , EAX
591F26 B802000000 MOV EAX , # 2
591F2B 3B45F8 CMP EAX , F8 [EBP]
591F2E 0F9EC0 SETLE AL
591F31 83E001 AND EAX , # 1
591F34 48 DEC EAX
591F35 8D6DFC LEA EBP , FC [EBP]
591F38 0BC0 OR EAX , EAX
591F3A 8B4500 MOV EAX , 0 [EBP]
591F3D 8D6D04 LEA EBP , 4 [EBP]
591F40 0F8410000000 JE 591F56 ( fact+36 )
591F46 8B4500 MOV EAX , 0 [EBP]
591F49 894500 MOV 0 [EBP] , EAX
591F4C B801000000 MOV EAX , # 1
591F51 E950000000 JMP 591FA6 ( fact+86 )
591F56 8945FC MOV FC [EBP] , EAX
591F59 B801000000 MOV EAX , # 1
591F5E 8B55FC MOV EDX , FC [EBP]
591F61 8945FC MOV FC [EBP] , EAX
591F64 8BC2 MOV EAX , EDX
591F66 8D4001 LEA EAX , 1 [EAX]
591F69 8945F8 MOV F8 [EBP] , EAX
591F6C B801000000 MOV EAX , # 1
591F71 BBA61F5900 MOV EBX , # 591FA6
591F76 3B45F8 CMP EAX , F8 [EBP]
591F79 7505 JNE 591F80
591F7B 8B45FC MOV EAX , FC [EBP]
591F7E FFE3 JMP EBX
591F80 53 PUSH EBX
591F81 BB00000080 MOV EBX , # 80000000
591F86 2B5DF8 SUB EBX , F8 [EBP]
591F89 53 PUSH EBX
591F8A 03D8 ADD EBX , EAX
591F8C 53 PUSH EBX
591F8D 8B45FC MOV EAX , FC [EBP]
591F90 8945FC MOV FC [EBP] , EAX
591F93 8B0424 MOV EAX , [ESP]
591F96 2B442404 SUB EAX , 4 [ESP]
591F9A F76DFC IMUL FC [EBP]
591F9D FF0424 INC [ESP]
591FA0 71EE JNO 591F90
591FA2 8D64240C LEA ESP , C [ESP]
591FA6 C3 RET NEAR
END-CODE
Для скорости fact лучше сделать на ассме
Код:
: fact B=A $ -1 B=aB L1: *B B-- L1 JNZ ;
CODE fact
591FC0 8BD8 MOV EBX , EAX
591FC2 8D5BFF LEA EBX , FF [EBX]
591FC5 F7EB IMUL EBX
591FC7 4B DEC EBX
591FC8 75FB JNE 591FC5
591FCA C3 RET NEAR
END-CODE
С числами-разложениями исходного числа на стеке при переборе происходят нелады(краевые д'эффекты похоже - не вникал)
Код:
673219
..............................................
6 7 3 ~ fact ~ fact ~ * fact - 2 1 9 + * *
6 7 3 ~ fact ~ fact ~ * fact - 21 9 ~ fact - *
6 7 3 ~ fact ~ fact ~ * * 2 29 ~ * ~ - ~
6 7 3 ~ fact ~ fact ~ * * 2 29 ~ * + ~
.............................................
6 73 2 2 * fact + - ~ 9 ~ -
6 73 2 2 * fact + - ~ 9 +
6 73 ~ fact ~ fact ~ fact - 2 7 ~ fact 9 + * *
6 73 ~ fact ~ fact ~ fact - 2 * 7 ~ fact 9 + *
.............................................
6 7 ~ 3 2 * fact + - ~ 7 / 9 ~ fact -
6 7 ~ 3 2 * fact + - ~ 7 / 9 fact ~ fact -
6 7 ~ 32 ~ fact ~ fact ~ fact ~ * + 7 * 9 +
6 7 ~ 32 ~ + ~ - 3 ~ * 9 ~ fact ~ fact +
6 7 ~ 32 ~ + ~ - 3 ~ * 9 ~ fact ~ -
.............................................
и потом снова 673229 и т.д., хотя перебор функций вроде нормально при этом идет
Немного насчет перебора вообще
Процы Неймана и Гарварда и новые и старые не приспособлены к переборным алгоритмам
Тянуть перебор программно - это дикие тормоза даже если оптимизировать код.
Нужна систолическая аппаратная структура(лучше перестраиваемая из программы - под разные алгоритмы перебора, еще лучше перед этим описанная в самой программе - типа ПЛИС) в самом ядре проца.