View Single Post
Old 24-03-2010, 15:39   #1
Z80Fan
Senior Member
 
L'Avatar di Z80Fan
 
Iscritto dal: Sep 2009
Messaggi: 638
[Assembly] Microprocessors contest: Merge Sort

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:
  1. I dati di input sono 27. Potete scegliere quelli che volete.
  2. Potete scegliere qualsiasi architettura vogliate
  3. 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...)
  4. Di conseguenza non dovete presupporre coprocessori o altre periferiche esterne al processore
  5. 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)
  6. Il risultato dell'elaborazione lo dovete lasciare in un array in memoria, non bisogna visualizzarlo o inviarlo a qualche periferica.
  7. Il codice dovrebbe far uso il più possibile delle caratteristiche del processore
  8. 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 -------------
__________________
| Il mio "OS" (thread su HWU) | |

Ultima modifica di Z80Fan : 10-05-2012 alle 17:52. Motivo: aggiunta versione ARM
Z80Fan è offline   Rispondi citando il messaggio o parte di esso