Salve programmatori !
In questo thread potrete divertirvi a programmare il vostro processore preferito (meglio, la vostra architettura di processore preferita) in assembly per implementare il famoso algoritmo del Merge Sort (
http://it.wikipedia.org/wiki/Merge_sort)
Le "regole" sono:
- I dati di input sono 27. Potete scegliere quelli che volete.
- Potete scegliere qualsiasi architettura vogliate
- Il codice non deve essere legato a qualche particolare macchina (per esempio, il codice per il 68000 non deve essere pensato per girare apposta su un Amiga) - questa regola non vale se il processore è la macchina (ad esempio sistemi vecchi e vecchissimi tipo edsac, pdp ecc...)
- Di conseguenza non dovete presupporre coprocessori o altre periferiche esterne al processore
- Per le regole sopra, il codice deve essere eseguito da solo, quindi niente sistema operativo, niente librerie ecc... (non vi preoccupate di come il programma è stato inserito in memoria, fate finta che sia lì e basta)
- Il risultato dell'elaborazione lo dovete lasciare in un array in memoria, non bisogna visualizzarlo o inviarlo a qualche periferica.
- Il codice dovrebbe far uso il più possibile delle caratteristiche del processore
- Sarebbe carino se il listato fosse commentato

Per farvi capire come dovrebbe apparire il codice, mostro un esempio di un codice per processore MIPS per fare la somma degli elementi corrispondenti e mettere il risultato in un terzo vettore.
Codice:
; Programma che somma gli elementi corrispondenti di 2 vettori in un terzo
.data
v1: .word32 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
v2: .word32 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
v3: .word32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.text
main:
xor r1, r1, r1 ; azzero l'indice per i vettori
ori r2, r0, 10 ; carico il numero di elementi dei vettori in R2
ciclo:
lw r3, v1(r1) ; carico gli operandi
lw r4, v2(r1)
add r3, r3, r4 ; eseguo l'addizione
addi r2, r2, -1 ; decremento il contatore (lo ho messo qua per sfruttare la pipeline, risparmio quasi 30 cicli di clock per tutta l'esecuzione)
sw r3, v3(r1) ; scrivo il risultato
addi r1, r1, 4 ; incremento il puntatore
bne r2, r0, ciclo ; ripeto se non-zero
Vedete che il listato dovrebbe essere ben indentato e commentato.
Se nel vostro codice avete inserito un'ottimizzazione di cui siete particolarmente orgogliosi, potete scrivere un commento nel listato o una descrizione nel post.
Come già detto, potete scegliere qualsiasi architettura, non importa quanto vecchia o strana.
Questo è tutto, vi auguro una buona programmazione!
------------- Versioni Disponibili -------------