Cálculo de fatorial com precisão estendida

Escreva um programa para calcular o fatorial de forma não recursiva com precisão limitada apenas pela capacidade da memória RAM. O fatorial pode ser armazenado na memória RAM no formato "little endian", o que simplifica a solução (pois a multiplicação é feita a partir dos dígitos menos significativos): inicialize um vetor na memória RAM com 0x01, 0x00,0x00...etc para representar o valor 1 no formato little endian (veja como dimensionar o vetor a seguir); se N é o número cujo fatorial desejamos calcular multiplique sucessivamente esse valor por N, N-1,...,1.

Como log n! = log 1 + log 2 + ... + log n < nlog n um limite superior para o tamanho do buffer para armazenar o fatorial de n é dado por M= n*log2(n) bits = (n*log2(n))/32 palavras e poderia ser calculado em tempo de montagem se diretivas do assembler possuissem a função log como parte de uma expressão, o que não ocorre com a toolchain do gcc (observe, no entanto, que 64! requer menos que 12 palavras pelo cálculo da fórmula acima).

Sugestão: multiplique (na base 10) 9 x 19 e analize cuidadosamente a propagação dos "vai um". Veja também no manual de instruções a especificação da instrução umull. Seus testes devem incluir fatoriais que requerem pelo menos 64 bits e os fatoriais de 16, 32 e 64 abaixo exibidos. Para calcular e visualizar fatoriais em hexadecimal use o seguinte programa em python:

N= input('Entre com fatorial a calcular: ')
f=1
for i in range(2,N+1):
  f=f*i
print f
print "%2d!=%x (em hexadecimal)" %(N, f)

Exemplos:
16!=130777758000 (em hexadecimal)
32!=32ad5a155c6748ac18b9a580000000 (em hexadecimal)
64!=ff23c771a4224f3ea955f44abb627cafecd3822f290c6ef93cd162c0058000000000000000 (em hexadecimal)