Calcul de la moyenne arithmétique entière d’un tableau de nombres en Assembleur

Programme assembleur AVR calculant la moyenne entière d’un tableau 8 bits sur ATmega328P, avec gestion 16 bits et division entière.

Brève Introduction

Calcul de la moyenne arithmétique entière d’un tableau de nombres en Assembleur (assembly)
DESCRIPTION :
Ce programme en assembleur calcule la moyenne arithmétique entière d'un tableau de nombres sur 8 bits. Le tableau est défini en mémoire, le programme additionne tous les éléments et divise par le nombre d'éléments, retournant le résultat dans un registre. C'est un exemple robuste et prêt à l'emploi pour les microcontrôleurs basés sur l'architecture AVR (ex. ATmega328P).

NOTES SUPPLÉMENTAIRES :
Le programme suppose que les valeurs du tableau sont des entiers positifs sur 8 bits. La somme est gérée sur 16 bits pour éviter les débordements avec des tableaux jusqu'à 255 éléments. La division est entière, donc la moyenne est tronquée.

EXPLICATIONS :
- La section .data contient le tableau de nombres et sa taille.
- La somme est accumulée dans deux registres (R17:R16) pour gérer des valeurs jusqu'à 65535.
- Une boucle parcourt le tableau en incrémentant un index et en additionnant chaque élément.
- À la fin, la somme est divisée par la taille du tableau à l'aide d'une routine de division entière.
- Le résultat (moyenne) est sauvegardé dans R18.
- Le programme se termine par une boucle infinie pour arrêter l'exécution.

Code d'Exemple : assembly

; 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 end
×
×
×
Veux-tu régénérer la réponse ?
×
Exporter le chat
Choisissez le format d'export
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Vous êtes sur le point de fermer le chat et de passer au générateur d’images. Si vous n’êtes pas connecté, vous perdrez notre conversation. Confirmez-vous ?
👁 Tu consultes une discussion partagée en mode temporaire. Elle ne sera pas enregistrée.
💬
×
Prompts enregistrés
×
Note privée
×
Étiquette
×
Rechercher dans toutes les discussions
×
Vos insights
Analyse en cours…
×
Préférences IA
Nom de l'assistant 30
Longueur des réponses
Modèle IA
Réponses structurées
Inclure des exemples
Utiliser des emojis
Guide-moi, ne résous pas Des indices et des questions plutôt que la réponse toute faite
Plus de réglages →
×
Partager cette discussion
Toute personne ouvrant ce lien pourra consulter la discussion ou l'ajouter à son profil comme discussion personnelle.
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
Discussion partagée
Quelqu'un a partagé une discussion avec toi. Veux-tu seulement la consulter ou l'ajouter à tes discussions ?
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
×

📌 Messages enregistrés

Chargement...

×

Historique des discussions

programmes-exemples · HISTORIQUE DU CHAT

Chargement...

Préférences IA

×
  • 🟢 BasiqueRéponses rapides et essentielles pour étudier
  • 🔵 MoyenQualité supérieure pour étude et programmation
  • 🟣 AvancéRaisonnement complexe et analyses détaillées
Expliquer les étapes

Qu'est-ce qu'il faut ?

Microcontrô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

Sujets Similaires

Somme de deux nombres constants en assembleur
Exemple simple en assembleur AVR pour additionner deux nombres constants et stocker le résultat sur ATmega328P, sans entrée/sortie externe.
Comparaison de deux nombres et définition d’un drapeau en assembleur
Exemple en assembleur x86 Linux 32 bits pour comparer deux nombres entiers et définir un drapeau selon la comparaison avec NASM et ld.
Programme Assembleur pour Multiplication Simple de Deux Nombres
Programme assembleur pour multiplication simple de deux entiers positifs sur microcontrôleur Atmel AVR, utilisant une boucle d’addition répétée.
Programme assembleur qui définit et utilise une variable entière
Exemple de programme assembleur x86 32 bits en NASM montrant la définition, modification et sauvegarde d’une variable entière en mémoire sous Linux.
Somme de trois nombres constants dans différents registres
Exemple en assembleur AVR pour additionner trois nombres constants dans différents registres et stocker le résultat dans un registre dédié.
Somme d’un tableau d’entiers stocké en mémoire en assembleur
Exemple complet en assembleur x86 32 bits pour additionner un tableau d’entiers en mémoire sous Linux avec NASM et appels système.
Recherche de la valeur maximale dans un petit tableau d’entiers en assembleur
Exemple en assembleur AVR pour trouver la valeur maximale dans un tableau d’entiers 8 bits sur microcontrôleur ATmega328P (Arduino Uno).
Programme assembleur qui compte le nombre d’éléments non nuls dans un tableau
Programme assembleur AVR pour compter les éléments non nuls dans un tableau de 8 octets, avec code commenté et compatible microcontrôleur ATmega328P.