Accueil
Démo
Exercices formatifs
Travaux pratiques
Simulation libre
Sessions sauvegardées

Calcul des N premiers nombres premiers avec le crible d'Ératosthène

Calculons les 128 premiers nombres premiers en utilisant le crible d'Ératosthène. Voyez la page Wikipédia expliquant cet algorithme pour plus de détails sur son fonctionnement. Le programme travaille sur un tableau de 128 nombres en mémoire RAM.

Registre Généraux (User)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 (sp)
R14 (lr)
R15 (pc)

Registre Généraux (FIQ)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8 FIQ
R9 FIQ
R10 FIQ
R11 FIQ
R12 FIQ
R13 FIQ (sp)
R14 FIQ (lr)
R15 (pc)

Registre Généraux (IRQ)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 IRQ (sp)
R14 IRQ (lr)
R15 (pc)

Registre Généraux (SVC)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 SVC (sp)
R14 SVC (lr)
R15 (pc)

État courant

 CPSRSPSR
Negatif (N)
Zero (Z)
Retenue (C)
Dépassement (V)
Ignore IRQ
Ignore FIQ

Configurations

Interruptions

Activer
Type
 cycles
 cycles (premier)
Vitesse d'exécution :  ms

Français

SECTION INTVEC B main SECTION CODE main LDR R10, =nombres ; R10 contiendra l'adresse du tableau ; On utilise un tableau de 128 nombres (les chiffres de 0 à 127) MOV R11, #128 ; R11 contiendra la taille du tableau ADD R12, R10, R11 ; R12 contiendra l'adresse du premier élément ; après le tableau (autrement dit la fin du tableau) ; 1) Initialisation du tableau de nombres MOV R0, #0 boucleInit STRB R0, [R10], #1 ; La valeur de la case mémoire correspond à son décalage par ; rapport au début du tableau ; Nous utilisons des tableaux ASSIGN8 (1 octet par élément), ; donc il faut utiliser STRB! ADD R0, R0, #1 ; On passe à la case suivante CMP R10, R12 BNE boucleInit ; Tant que R10 != R12 ; 2) Commencer à éliminer les nombres MOV R5, #2 ; On commence à 2 (les cas de 0 et 1 sont spéciaux) bouclePrincipale LDR R10, =nombres ; On trouve le prochain élément (R5 ou plus) qui n'est pas zéro boucleRechercheProchainNombrePremier CMP R5, R11, LSR #1 ; A-t-on atteint la moitié du tableau? BGE finProgramme ; Si oui, on a terminé! LDRB R1, [R10, R5] ; Si non on lit le nombre à cette adresse CMP R1, #0 ; Le nombre à cette adresse est-il 0? ADDEQ R5, R5, #1 ; Si oui, il faut passer au suivant ; Notez le suffixe EQ : cette addition n'est PAS effectuée ; si R1 n'est pas 0 BEQ boucleRechercheProchainNombrePremier ; On revient au début de la boucle ; À ce stade-ci, R5 contient le prochain nombre premier dont il faut éliminer les multiples ; On part de ce nombre ADD R10, R10, R5 ; 3) Sauter jusqu'à la fin du tableau 'R5' cases a la fois MOV R1, #0 ; On ne peut pas directement faire STRB #0, il faut utiliser un registre boucleMiseAZero ; On doit additionner le nombre avant de faire le STR, ou sinon on va effacer le nombre lui-même! ADD R10, R10, R5 CMP R10, R12 ; Est-on hors des limites du tableau? BGE finBoucleMiseAZero ; Si R10 >= R12, on saute hors de la boucle STRB R1, [R10] ; On écrit 0 à cet emplacement B boucleMiseAZero ; On passe au nombre suivant dans le tableau finBoucleMiseAZero ADD R5, R5, #1 ; On a terminé d'éliminer les multiples de ce nombre premier ; On passe au suivant B bouclePrincipale finProgramme B finProgramme ; Boucle infinie à la fin du programme SECTION DATA nombres ALLOC8 128 ; Tableau contenant les nombres. Sa taille doit correspondre à la ; valeur contenue dans R11 (voir ligne 12) ; Notez que chaque élément fait 1 octet et non 4! (ALLOC8)

Instruction courante

Mémoire

Suivre PC
Cycle courant :