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 :

Calculer l'adresse réelle à partir de segment:offset


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut Calculer l'adresse réelle à partir de segment:offset
    Bonjour voila j ai cherché comment calculer l' adresse réelle en mémoire a partir d'un vecteur d'interruption 32 bits.

    et j ai trouvé ceci: segment * 16 + offset

    et j ai également trouvé aussi ça:

    exemple: 54FF:00F0
    00F0:54FF
    F000:FF54

    Je voudrais savoir ci c est correct?

    Pouvez vous m aider merci d'avance.

  2. #2
    Noteworthy
    Invité(e)
    Par défaut
    Yo Jacko,

    La mémoire dans le mode d'adressage segmenté n’est pas un long et unique bloc, mais une suite de "segment". Les segments ont une taille limite de 64Ko. Cette capacité d’adressage de 65 535 octets est due à la limite des 16 bit des premiers processeurs 8086. A l’époque, en 1981, un processeur qui était capable d’adresser plus de 64 ko, c’était très fort, et le prix de la RAM était prohibitif. Pour trouver l’adresse réelle (physique ou effective) de la mémoire, il faut une valeur de positon appelé en anglais "offset" (décalage). Cet offset est donc le déplacement qui existe entre le premier octet du segment et l’octet de la mémoire qui est pointée.
    A partir de ces deux valeurs segment:offset, on peut localiser n’importe quel octet dans la mémoire adressable par le processeur.
    et j ai trouvé ceci: segment * 16 + offset
    Tout à fait d'accord, et donc ce qui reste est purement un aspect calculatoire. Tu peux jeter un coup d'oeil à ce post.

    Noteworthy.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Merci mais je voulais savoir si la deuxième maniéré était égale a la premier que j ai cité dans le premier post.

  4. #4
    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 jacko842 Voir le message
    Bonjour voila j ai cherché comment calculer l' adresse réelle en mémoire a partir d'un vecteur d'interruption 32 bits et j ai trouvé ceci: segment * 16 + offset, et j ai également trouvé aussi ça:

    exemple: 54FF:00F0
    00F0:54FF
    F000:FF54
    Tout ceci est vrai en assembleur Intel 80x86 et en mode 16 bits. Tous les microprocesseurs ont une façon propre de travailler et les x86 gèrent les segments d'une manière complètement différente en mode protégé.

    En mode réel, l'idée est que le registre de segment est décalé de 4 bits par rapport au registre d'adresse. Il vaut donc seize fois plus. Par conséquent, l'adresse 0012:0000 est la même que 0000:0120, ou 0001:0020.

    Ce système d'adresse est conçu comme tel d'une part parce que le 8086 est doté d'un bus d'adresse de 20 bits, soit un méga-octet, et qu'il était beaucoup plus simple de faire deux registres de 16 bits qu'un registre de 20 bits au sein d'une architecture 16 bits et, d'autre part, parce que ça permet de relocaliser en mémoire n'importe quel programme qui avait l'habitude de travailler sur un simple bus 16 bits, avec une granularité de 16 octets.

    EDIT : J'avais commencé à rédiger mon post cet après-midi, je n'avais pas vu le commentaire de Noteworthy.

  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 jacko842 Voir le message
    54FF:00F0
    00F0:54FF
    F000:FF54
    Citation Envoyé par jacko842 Voir le message
    Merci mais je voulais savoir si la deuxième maniéré était égale a la premier que j ai cité dans le premier post.
    Si tu veux savoir si ces trois vecteurs pointent la même adresse physique, la réponse est non.

    Il n'y a rien de compliqué, toutefois. La réponse se trouve dans la formule que tu donnes au premier post : Adresse physique = (Segment * 16) + Offset. Fais le cacul et regarde l'adresse que tu obtiens. Sachant que 16d = 10h, ça devrait largement simplifier tes calculs. Multiplier par seize en hexa, c'est comme multiplier par 10 en décimal.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 73
    Points
    73
    Par défaut
    Désolé de remonter ce post ... mais non seulement ce sujet m'intéresse ... mais il y a du plagiat!

    Citation Envoyé par Noteworthy Voir le message
    La mémoire dans le mode d'adressage segmenté n’est pas un long et unique bloc, mais une suite de "segment". Les segments ont une taille limite de 64Ko. Cette capacité d’adressage de 65 535 octets est due à la limite des 16 bit des premiers processeurs 8086. A l’époque, en 1981, un processeur qui était capable d’adresser plus de 64 ko, c’était très fort, et le prix de la RAM était prohibitif. Pour trouver l’adresse réelle (physique ou effective) de la mémoire, il faut une valeur de positon appelé en anglais "offset" (décalage). Cet offset est donc le déplacement qui existe entre le premier octet du segment et l’octet de la mémoire qui est pointée.
    A partir de ces deux valeurs segment:offset, on peut localiser n’importe quel octet dans la mémoire adressable par le processeur.
    Ca serait bon de donner ses sources ...
    C'est une copie texto du livre "Assembleur x86" de Jean-Bernard Edmond.

    kurapix

Discussions similaires

  1. Calcul de l'occupation réelle d'un segment
    Par farenheiit dans le forum Administration
    Réponses: 1
    Dernier message: 05/06/2009, 23h43
  2. Réponses: 9
    Dernier message: 26/08/2006, 19h35
  3. calcul de la date à partir du quantieme
    Par caribou_belle dans le forum C
    Réponses: 10
    Dernier message: 05/06/2006, 18h29
  4. Calcul d'une adresse réelle
    Par foufi5 dans le forum Assembleur
    Réponses: 2
    Dernier message: 16/11/2005, 23h07
  5. [Listener]Recuperer l'adresse Ip à partir de la session.
    Par Jaxofun dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 28/07/2005, 10h18

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