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 :

Adressage segmenté


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut Adressage segmenté
    Bonjour, tout d'abord , désolé car je ne savais pas trop ou poster...

    Bref je lis un cours sur l'asm de ce site
    Et je ne veux pas continuer avant d'avoir compris cette notion :

    JE cite le § en question

    II. LA MEMOIRE VIVE
    1. La segmentation de la mémoire
    Votre PC est conçu pour gérer 1 Mo (soit 220 octets) de mémoire vive en mode réel. Il
    faut donc 20 bits au minimum pour adresser toute la mémoire. Or en mode réel les bus
    d’adresses n’ont que 16 bits. Ils permettent donc d'adresser 216 = 65536 octets = 64 Ko, ce qui
    est insuffisant !
    Afin de pallier ce manque, on utilise deux nombres pour adresser un octet quelconque de la
    RAM. Le premier est appelé adresse de segment, le second adresse d'offset. Ils seront stockés
    séparément.
    La mémoire est ainsi découpée en segments de 64 Ko chacun. Un segment est donc en
    quelque sorte un gros bloc de mémoire auquel on peut accéder grâce à une adresse de
    segment qui désigne son numéro. Par exemple, le premier segment est le segment 0000 (en
    hexa), le deuxième est le 0001, le quarante-deuxième est le 0029, etc... Chaque numéro est
    codé sur 16 bits, c’est-à-dire 4 chiffres hexa.
    Pour accéder à un octet particulier dans un segment, il suffit de compter le décalage de cet
    octet par rapport au début du segment. Ce décalage est obligatoirement inférieur ou égal à
    65535 : il tient bien sur 16 bits lui aussi. On appelle ce décalage « offset ».
    L'adresse d'un octet se note XXXX:YYYY où XXXX est l'adresse de segment et YYYY est
    l'offset (tous deux en notation hexadécimale, bien sûr).
    Par exemple, le dix-septième octet de la RAM (le numéro 16) est situé à l'adresse 0000:0010.
    De même, l’octet 0000:0100 est l'octet numéro 256. Nous en arrivons à la petite subtilité qu’il
    convient de bien saisir, sous peine de ne rien comprendre à certains programmes en
    assembleur.
    On pourrait penser que l’octet qui se trouve à l’adresse 0001:0000 est le numéro 65536. Il n’en
    est rien. C'est l'octet numéro 16.
    Eh oui ! Les segments ne sont pas situés gentiment les uns à la suite des autres. Ils sont fort
    mal élevés et n'attendent pas que les segments qui les précédent soient terminés avant de
    commencer ! Ils se marchent donc sur les pieds.
    Autrement dit, le deuxième segment ne démarre pas à l'octet 65536 comme il devrait le faire s'il
    était bien sage, mais à l'octet 16 ! Le troisième démarre à l'octet 32 et ainsi de suite…
    Bref je comprend à peu près jusqu' à


    "On pourrait penser que l’octet qui se trouve à l’adresse 0001:0000 est le numéro 65536. Il n’en
    est rien. C'est l'octet numéro 16."

    Pouvez vous m'expliquez pourqu'oi??
    Merci !!


    PS : Je suis un gros débutant n'hésitez pas à en faire des tartines !!

  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
    l'article fait référence aux adresses utilisées en 16 bits que l'on peut oublier maintenant.Le 32 bit n'utilise pas la convention qui suit.
    Le segment (en 16 bits) donne le numéro d'une page mémoire .Une page est égal a 16 octets (bytes).
    0000: 0009 = 0*16 + 9 = 9
    0001:0009 = 1*16 + 9 = 25

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re
    Oki merci =)

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re
    au passage le tutoriel que je lis est useless?

    C'est

    Apprendre l'assembleur
    (INTEL - DOS 16 bits)
    Par Benoît-M

    Ce document a été téléchargé depuis http://benoit-m.developpez.com/assembleur/tutoriel

    Merci

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    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 372
    Points : 23 628
    Points
    23 628
    Par défaut
    C'est plus facile avec un dessin. :-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pour 0001:0000 :
     
       Offset          0000
     + Segment        0001
                --------------
     =                00010   = 16d

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

Discussions similaires

  1. Adressage segmenté
    Par foufi5 dans le forum Assembleur
    Réponses: 1
    Dernier message: 30/12/2005, 19h46
  2. Se passer de l'adressage segmenté ?
    Par fgh39 dans le forum Assembleur
    Réponses: 3
    Dernier message: 01/07/2004, 08h48
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58
  5. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47

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