moltiplicazione con registri insufficientemente lunghi [duplicato]

-1

Voglio moltiplicare due numeri, ma dal momento che non ho abbastanza registri nell'architettura corrente ho bisogno di "scomporli" in quelli più corti e in qualche modo eseguire il calcolo.

Ad esempio:

2048.125 x 2048.125 (2048.125 = > 4001hex) ma con il punto binario oltre la posizione del 4 ° bit (firmata Q12.4) e verso l'alto.

C'è un modo per suddividere l'operazione e combinare i risultati alla fine?

Sfortunatamente la configurazione su cui sto lavorando non supporta librerie ben note quindi, devo costruirne una da solo.

Fornisci tutti i suggerimenti che potrebbero portare all'implementazione orientata verso la matematica. Qualcosa che potrebbe emergere dalla manipolazione dei prodotti parziali o simili.

Grazie

    
posta Giwrgos Rizeakos 02.10.2015 - 11:55
fonte

1 risposta

0

Vorrei provare ad evitare la codifica in assembler e, se possibile, adattare un compilatore C esistente al tuo processore di destinazione.

Con GCC hai molti obiettivi che potrebbero ispirarti per il tuo processore, e ci sono molti documenti per questo (vedi riferimenti in link per ulteriori informazioni). Effettivamente richiede uno sforzo (mesi di lavoro).

Largo (ma dimensione fissa, ad esempio due% nativo int s-wide, come aritmetica a 64 bit su processori con parole a 32 bit) l'aritmetica viene eseguita in GCC all'interno di libgcc / directory, e la maggior parte è codificata in C (ma dipende molto da come il tuo GCC è configurato e mirato). Anche se non usi o porti GCC alla tua architettura (e credo che dovresti farlo), quel libgcc dovrebbe essere di ispirazione (e IIRC, alcuni libri di Knuth spiegano gli algoritmi sottostanti, molti dei quali sono abbastanza intuitivi). . Leggi anche wikipage su aritmetica in virgola fissa .

Se vuoi interi interi arbitrariamente grandi, hai bisogno di una libreria bignum . Non reinventare il tuo (ci sono molti algoritmi ingannevoli più efficienti rispetto al modo ingenuo che hai imparato a scuola, e troverai molti libri e molti articoli di ricerca e conferenze sull'argomento; può ottenere un dottorato di ricerca su Bignums e trascorrere una vita lavorativa completa su di loro). Utilizza uno esistente, ad es. GMPlib .

Anche per il tuo processore di destinazione, non devi codificare molto in assembler. Farai meglio a portarti un compilatore C esistente (e praticamente ne hai bisogno, se vuoi che il tuo processore sia usato).

    
risposta data 02.10.2015 - 12:40
fonte

Leggi altre domande sui tag