IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Calcul de CRC-16


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Calcul de CRC-16
    Bonjour je suis un débutant en assembleur. Je parviens à comprendre les concepts de base, mais j'ai tout de même certaines difficultés à coder.
    Je dois réaliser une fonction qui calcule le CRC-16 d'un tableau en utilisant la convention CRC-CCITT. Les paramètres de la fonction doivent être passés par la pile (stack).

    Il n'y a aucun passage de paramètres par les registres (AX,BX,CX, ETC...)

    Sans nécessairement avoir le code complet, j'aimerais que vous m'aidiez à cibler ce que j'ai à faire pour coder cette fonction. J'aimerais aussi savoir comment fonctionnent les boucles en assembleur 8086.

    Merci et bonne journée!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour et bienvenue,

    Citation Envoyé par peter88 Voir le message
    Il n'y a aucun passage de paramètres par les registres (AX,BX,CX, ETC...) Sans nécessairement avoir le code complet, j'aimerais que vous m'aidiez à cibler ce que j'ai à faire pour coder cette fonction. J'aimerais aussi savoir comment fonctionnent les boucles en assembleur 8086. Merci et bonne journée!
    Bienvenue « de l'autre côté », comme on dit. Tu peux considérer qu'en assembleur, il n'y a — presque — aucune programmation structurée, hormis l'usage de la pile. Il arrive bien un moment où les boucles et autres doivent être résolues en gotos, et c'est ici.

    Dans un premier temps, as-tu déjà l'habitude de l'assembleur sur d'autres micro-processeurs et/ou sais-tu déjà résoudre le CRC16 dans d'autres langages (parce que si tu débutes complètement, ça reste faisable mais ce n'est pas l'exercice le plus simple qui soit).

    Puisque tous les paramètres sont dans la pile et que tu travailles en x86 16 bits, le premier pas à faire est de sauver le pointeur de pile SP dans le registre BP en entrant dans ta fonction. Ceci te permet de le restaurer si tu dois quitter ta fonction au milieu d'une procédure (gestion des « exceptions », par exemple) et, surtout, cela te servira de pointeur de base (Base Pointer) pour aller chercher tes variables à l'aide d'un index BP, BP+4, BP+16, etc.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    À vrai dire j'ai déja codé la fonction en C mais j'aimerais la recoder en assembleur 8086 afin d'optimiser les performances et de me familiariser avec ce langage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Voici mon code en C:
     
    unsigned short CalculeCRC16Octet(unsigned short crc_actuel, unsigned char
    donnee)
    {
     
     
        int index;
        crc_actuel = crc_actuel ^ (donnee << 8);
     
        // L'operateur << decale les bits vers la gauche
        // Il est utilise parce qu'il faut faire un XOR entre
        // les 8 bits les PLUS significatifs du CRC et les 8 bits de la donnee
     
        for(index = 0; index < 8; index++)
        {
        // On parcourt tous les bits de l'octet a traiter, MSB en premier
            if(crc_actuel & 0x8000){  
                // Si le MSB (bit le plus significatif) du crc actuel est à 1
                // Alors on decale pour passer au bit suivant
                // et on fait un XOR avec le polynome (0x1021)
                crc_actuel = crc_actuel << 1;
                crc_actuel = crc_actuel ^ 0x1021;
                }
            else{
                // On passe simplement au bit suivant
                // en decalant l'octet vers la gauche
                crc_actuel = crc_actuel << 1;
                }
        }
        // Retour de la valeur du CRC
        return crc_actuel;

Discussions similaires

  1. recuperer (ou calculer le CRC d'un fichier)
    Par johannlb dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/08/2007, 17h15
  2. Calcul de CRC
    Par boubajazz dans le forum Linux
    Réponses: 1
    Dernier message: 13/06/2007, 11h18
  3. calcul du CRC sur 2 octets
    Par jeannot27 dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/12/2005, 10h55
  4. [SRC] Calcul de CRC
    Par cfdev dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/03/2005, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo