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

Assembleur Discussion :

Nombres stockés à l'inverse - endianess


Sujet :

Assembleur

  1. #1
    Membre du Club Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Points : 55
    Points
    55
    Par défaut Nombres stockés à l'inverse - endianess
    Bonjour,

    Voici une citation:
    [...]
    The assembler takes care of converting the decimal number 158 to its doubleword length 2's complement representation 0000009E. The bytes of this doubleword are actually stored backwards in the object code, a fact that we can almost always ignore.
    Pourquoi est-ce que les bytes sont "stored backwards" dans "l'object code"?
    Est-ce comme ça que ça se passe dans la mémoire vive du 80x86 en général aussi?
    Où seulement dans le code objet?

    Cordialement,
    Array

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    En clair (et en français), les nombres écrits dans l'assembleur(fichiers textes .asm..) sont écrits dans un format compréhensible par le microprocesseur dans les fichiers objets.
    Ce n'est pas uniquement valable pour les nombres décimaux,il y a aussi les réels...

  3. #3
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Ca me rappelle le "fight" entre les 68000 et les 8086.
    qui était le plus logique ?
    le 68000 codait les octets dans le sens de la lecture :
    exemple :
    BC12h : adresse n = BCh adesse n+1 = 12h

    Alors que l'intel faisait l'inverse (poids faible en premier)
    même exemple :
    BC12h : adresse n = 12h adresse n+1 = BCh

    Personnellement je trouve la méthode Intel assez logique, surement parce que
    j'y suis habitué depuis des années

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Il y a deux manières possibles de stocker les nombres.

    Lectures conseillées :

    http://www.ai.univ-paris8.fr/~fb/Cou...big-endian.pdf

    http://fr.wikipedia.org/wiki/Endianness

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Array Voir le message
    Bonjour,

    Voici une citation:

    [...]
    The assembler takes care of converting the decimal number 158 to its doubleword length 2's complement representation 0000009E. The bytes of this doubleword are actually stored backwards in the object code, a fact that we can almost always ignore.
    Pourquoi est-ce que les bytes sont "stored backwards" dans "l'object code"?
    Est-ce comme ça que ça se passe dans la mémoire vive du 80x86 en général aussi? Où seulement dans le code objet?
    C'est un peu fumeux, comme commentaire : je ne vois pas du tout en quoi « 9E » serait le complément à 2 de 158 !

    Pour le reste l'endianess est un principe très répandu dans le monde des micro-processeurs. Lorsque qu'une valeur s'étend sur plus d'un mot binaire (comprendre par là : une unité d'adressage, donc généralement « un octet » sur les micro-processeurs les plus courants), ceux qui utilisent le big endian comment par le « bout le plus grand (la gauche du nombre), c'est-à-dire stockent le nombre en mémoire de la manière dont on l'écrit sur papier, et ceux qui utilisent le little endian commencent par la droite, et stockent donc ce nombre à l'envers, mais octet par octet.

    Donc, le nombre 12345678h sera stocké en mémoire 78563412h.

    Cela est dû à des considérations principalement technologiques. En procédant ainsi, le micro-processeur peut utiliser un système de pile pour faire ses enregistrements et relectures mais également de garder une compatibilité entre les instructions de différents formats. Ainsi, selon les formats, « 9E » sera enregistré comme suit en mémoire :

    8 bits : 9E
    16 bits : 9E 00
    32 bits : 9E 00 00 00
    64 bits : 9E 00 00 00 00 00 00 00

    De cette façon, chaque format reprend le précédent et l'étend. C'est pratique tant d'un point de vue électronique que logiciel car, dans ce dernier, cas, quel que soit le format, la donnée démarre toujours à la même adresse. Et si on utilisé dès le départ le plus long format, il suffit de lire directement la mémoire à partir du premier octet pour que le « transtypage » soit automatique. Autrement, il aurait fallu tenir compte de la taille de la donnée initiale et calculer un offset en conséquence.

    Maintenant, c'est un bien pour un mal : c'est effectivement beaucoup plus pénible pour les programmeurs de bas niveau qui doivent eux-mêmes remettre les données dans l'ordre lorsqu'ils examinent les dump mémoire. C'est chiant aussi lorsque l'on veut remplir une grande zone de mémoire avec des données ordonnées dans le but de l'exporter. Ça oblige à faire la conversion, même si les x86 proposent SWAP qui permet de renverser l'endianess d'un mot en une seul fois.

  6. #6
    Membre du Club Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Obsidian
    En procédant ainsi, le micro-processeur peut utiliser un système de pile pour faire ses enregistrements et relectures mais également de garder une compatibilité entre les instructions de différents formats.
    Est-ce que je pourrais aller plus loin en posant la question: Quel genre de systeème de pile le processeur utilise-t-il? Quand je fais 234h * 345h, comment le processeur fait-il pour faire la multiplication?! Est-ce qu'il inverse lui-même les nombres, effectue la multiplication, et ré-inverse le nombre ensuite?

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Obsidian
    Est-ce que je pourrais aller plus loin en posant la question: Quel genre de systeème de pile le processeur utilise-t-il? Quand je fais 234h * 345h, comment le processeur fait-il pour faire la multiplication?! Est-ce qu'il inverse lui-même les nombres, effectue la multiplication, et ré-inverse le nombre ensuite?
    Oui, la gestion de l'endianess est transparente pour le programmeur (tant que l'on reste sur le même format, bien sûr). Tout registre chargé ou sauvegardé par un x86 l'est automatiquement en little endian. La valeur en question est donc déjà dans le bon sens avant d'être traitée et ce, même si tu adresses directement la mémoire sans passer explicitement par un registre. C'est vrai également pour tous les modes d'adressages, y compris le mode immédiat quand la donnée suit immédiatement le code opération.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre stocké sous format texte
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 22/07/2009, 13h40
  2. Nombre stocké sous forme de texte
    Par Archampi dans le forum Excel
    Réponses: 2
    Dernier message: 05/11/2008, 20h53
  3. Nombre stocké sous forme de texte
    Par krhyme dans le forum IHM
    Réponses: 5
    Dernier message: 31/10/2007, 00h12
  4. addition de nombre stocké dans des zones texte
    Par jejeman dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/07/2007, 12h11
  5. [VBA-E] Probleme avec Nombre stocké sous forme de texte
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/07/2006, 01h46

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