1 ; Programme qui lit 10 entiers, les trie et les affiche
3 ; Note: Ce programme essaye d'être aussi lisible que possible, donc aucune optimisation assembleur n'est faite
6 ; le programme est découpé en trois étapes : - la lecture ; 2 - le tri ; 3 - l'affichage.
7 ; Théoriquement, le tri et l'afichage aurait pu etre fusionés, mais cela compexifie la lecture et le gain en performance est minime.
12 tab: .BLOCK 20 ; int[10] tab // #2d10a Tableau de 10 entiers (1 mot par entier)
13 tablen: .EQUATE 20 ; // taille du tableau (en octets)
16 ;lire: lit les entiers de l'input et les range dans le tableau.
17 ; l'algo utilise une simple boucle sur X pour lire toutes les cases
20 BRGE lire_fin ; for (X=0; X<tablen; X+=2) { // 2 car on compte les octets
21 DECI tab,x ; tab[X] = DECI();
23 BR lire_bcl ; } // fin for
24 lire_fin:RET0 ; return;
27 ;ecrire: ecrit les entiers du tableau sur l'output en les séparants par des espaces et en terminant la ligne par un retour chariot.
28 ; l'algo utilise une simple boucle sur X pour écrire toutes les cases
31 BRGE ecri_fin ; for (X=0; X<tablen; X+=2) { // 2 car on compte les octets
33 CHARO ' ',i ; print(tab[X], ' ');
35 BR ecri_bcl ; } // fin for
40 ;trier: trie par permutation du tableau.
41 ; l'algo utilise deux boucles impriquées
46 BRGE trie_fin ; for(i=0; i<tablen; i+=2) { // grande boucle
47 ; ; // l'objectif de cette grande boucle est de mettre dans tab[i] le plus petit element restant
48 ; ; // l'invariant de boucle est que les éléments avant i sont déjà bien placés (triés)
55 BRGE blc2_fin ; for(j=i+2; j<tablen; j+=2) { // petite boucle
56 ; ; // l'objectif de cette petite boucle est de chercher via tab[j] le plus petit élément restant
57 ; ; // l'invariant de boucle est que tout élément entre i et j est plus grand que tab[i]
62 BRLE noswitch ; if (tab[i] > tab[j]) {
63 ; ; // pour respecter l'ordre, il faut inverser tab[i] et tab[j]
66 STA tmp,d ; tmp = tab[i];
70 STA tab,x ; tab[i] = tab[j];
73 STA tab,x ; tab[j] = tmp;
74 noswitch:NOP0 ; } // fin if
80 blc2_fin:NOP0 ; } // fin boucle j (cat j+=2)
85 BR tri_bcl1 ; } // fin boucle i (cad i+=2)
87 trie_fin:RET0 ; return;
88 ; variables utiliées par la fonction `trier':
89 i: .BLOCK 2 ; indice de la grande boucle
90 j: .BLOCK 2 ; indice de la petite boucle
91 tmp: .BLOCK 2 ; valeur temporaire pour la permutation