Programme assembleur AVR calculant la moyenne entière d’un tableau 8 bits sur ATmega328P, avec gestion 16 bits et division entière.
; Programme AVR Assembleur pour calculer la moyenne arithmétique entière d'un tableau de nombres sur 8 bits
; Cible : ATmega328P (Arduino Uno)
; Auteur : Senior Software Engineer
; Description : Additionne les éléments d'un tableau et calcule la moyenne entière
.include "m328pdef.inc" ; Inclure les définitions spécifiques à l'ATmega328P
; Section données
.dseg
array: .byte 10, 20, 30, 40, 50 ; Tableau de 5 éléments
array_len: .byte 5 ; Taille du tableau
.cseg
.org 0x0000
rjmp start ; Vecteur de reset
start:
; Initialiser les registres
ldi r16, 0 ; R16:R17 = somme octet bas
ldi r17, 0 ; somme octet haut
ldi r18, 0 ; moyenne (sortie)
ldi r19, 0 ; compteur d'index
lds r20, array_len ; charger la taille du tableau dans r20
loop_sum:
cp r19, r20 ; comparer l'index avec la taille
breq calc_media ; si index == taille, fin de la somme
; Charger l'élément array[r19]
ldi r30, lo8(array) ; charger l'adresse de base du tableau dans Z
ldi r31, hi8(array)
add r30, r19 ; ajouter l'index au pointeur (octet bas)
adc r31, __zero_reg__ ; ajouter la retenue au pointeur (octet haut)
ld r21, Z ; charger la valeur array[r19]
; Ajouter r21 à la somme 16 bits (r17:r16)
add r16, r21 ; addition octet bas
adc r17, __zero_reg__ ; addition octet haut avec retenue
inc r19 ; incrémenter l'index
rjmp loop_sum ; répéter la boucle
calc_media:
; r17:r16 contient la somme 16 bits
; r20 contient la taille du tableau
; Diviser la somme par la taille (division 16 bits / 8 bits)
; Résultat dans r18 (moyenne)
; Copier la somme dans les registres pour la division
mov r22, r17 ; octet haut somme
mov r23, r16 ; octet bas somme
mov r24, r20 ; diviseur
; Routine de division 16 bits / 8 bits
; Retourne le quotient dans r18
clr r18 ; effacer le quotient
ldi r25, 16 ; compteur de bits
div_loop:
; Décaler la somme à gauche (r22:r23)
lsl r22
rol r23
; Soustraire le diviseur si possible
cp r22, r24 ; comparer l'octet haut somme avec le diviseur
brlo skip_sub
sub r22, r24
inc r18 ; incrémenter le quotient
skip_sub:
dec r25
brne div_loop
; r18 contient la moyenne entière
end:
; Fin du programme : boucle infinie
rjmp endMicrocontrôleur : ATmega328P (Arduino Uno)
Brochage Arduino : Aucun pin externe nécessaire pour ce calcul, le programme travaille uniquement en mémoire interne.
Tableau d'entrée : défini dans la section .data, taille et valeurs configurables
Registres utilisés : R16-R19 pour la somme et les compteurs
Dépendances logicielles : aucune bibliothèque externe, code assembleur pur pour AVR
Configuration : le programme suppose une horloge standard et un environnement de développement AVR (ex. Atmel Studio ou avr-gcc avec assembleur)
Connexions : aucune connexion matérielle requise