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 :

Qu'est ce qu'un offset [FAQ]


Sujet :

Assembleur

  1. #1
    gtr
    gtr est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 24
    Points : 16
    Points
    16
    Par défaut Qu'est ce qu'un offset
    Bonjour à tous,

    Ça peut paraître simple mais pour moi ça ne me rentre pas dans la tête...

    Pouvez-vous m'expliquer exactement, clairement et idéalement avec un graphique(si possible, je suis visuelle et ça m'aiderais surement) ce que c'est l'offset.

    Ne me dite pas simplement que c'est un décallage par rapport au segment car c'est ça que je ne comprend pas. J'ai lu des tutoriels, des livres et désolé mais ça ne rentre pas dans ma petite tête

    Merci de vos explications et surtout ne vous moquez pas de moi s'il vous plaît.

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Salut,

    Offset veut dire "décalage" en anglais, mais ca tu le sais déjà.

    On peut prendre l'exemple suivant : imagine la mémoire comme une route, et les segments comme des bornes kilométriques sur cette route. Pour désigner précisément un endroit sur la route, on a besoin de la borne kilométrique, et du nombre de mètres derrière cette borne. Ainsi pour aller au km 27,342, on dira segment 27 offset 342.

    Un peut d'ascii art :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Seg.1          Seg.2          Seg.3         Seg.4           .....
    --|--------------|--------------|-------*------|--------------|--
                                    |<----->|
                                      Offset
     
    Le * désigne le point qu'on veut repérer, il est à l'adresse Seg.3:Offset
    vic

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Ca va certainement pas t'aider plus, mais il existe des moyens pour calculer l'adresse physique (l'adresse physique c'est l'addresse à laquelle on accede directement dans la mémore vive. Lorsque le processeur fonctionne en mode reel (Ce qui est le cas sous DOS quand aucun gestionaire de mémoire est installé) l'addresse physique se calcule simplement :

    Adresse Physique = Segment * 16 + Offset

    Si il n'y avait que l'offset, ce serait genant puisqu'a la base il est en 16 bits, on ne pourrait acceder qu'a 2^16 = 65536 octets de la mémoire. Donc on rajoute le segment, qui a un poid 16 fois plus fort que l'ofset. grace à cette manière de pointer les données "segment:offset" on peut acceder à 1 Mo. Petit exemple : Si on veut mettre la valeur 1Ah dans l'octet d'adresse physique 10020h, on peut ecrire le programme simple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov ax, 1000h
    mov ds, ax         ;On est obligé de passer par ax pour changer la valeur d'un registre segment
    mov ds:[20h], 1Ah
    Et on a bien 1000h * 16 + 20h = 10000h + 20h = 10020h. On aurai pu très bien choisir F00h et 1020h ou 1001h et 10h.

    (Je sais pas si ca aise beaucoup ce que je dis)

    Blustuff.[/quote]

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 211
    Points : 11 721
    Points
    11 721
    Par défaut
    Encore un petit exemple.
    Sur µC 68HC811E2 (Motorola)

    Admettons que tu veuilles charger l'accumulateur A du µC en mode indéxé, avec la valeur contenu dans le registre du port C.

    Tu sais que le port C se trouve en page 1003.
    Dans ce cas tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PORTC    EQU     $03  *Equivalence du port C du 68HC811E2
             LDX    #1000 * Charger le registre d'index X avec la valeur immédiate 1000 (décimal)
             LDAA    PORTC,X *Charger l'accu A avec la valeur du port C
    Voilà en gros ce qui c'est passé:
    LDAA 3+1000 (donc valeur+offset) ce qui est équivalent à LDAA 1003.

  5. #5
    gtr
    gtr est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    OK, c'est clair maintenant

    Merci pour vos réponses et pour ce qui est de la route Vic, ça m'a permis de me faire un petit exemple plus simple.

    Je prend une petite règle de plastique de 15cm, mais Segment sont les cm(0,1,2,3...14), les offsets sont les mm.

    Si je prend le Segment:Offset=0004cm:0007mm(avec ma petite règle), le 7mm est donc le 7ième mm(Offset) du 4ième cm(Segment).

    Et pour obtenir sont adresse physique ou y accéder directement, je calcul donc 4*10(puisque dans mon exemple on est en décimal, base 10)+7=47.

    Pour y accéder directement je vais donc au 47mm

    Encore merci, enfin c'est clair à moins que je ne me trompe...

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Points : 22
    Points
    22
    Par défaut Bon exemple.
    Citation Envoyé par gtr
    Je prend une petite règle de plastique de 15cm, mais Segment sont les cm(0,1,2,3...14), les offsets sont les mm.
    Si je prend le Segment:Offset=0004cm:0007mm(avec ma petite règle), le 7mm est donc le 7ième mm(Offset) du 4ième cm(Segment).
    Pour y accéder directement je vais donc au 47mm
    (...)enfin c'est clair à moins que je ne me trompe...
    C'est bien cela tu as tout pigé, en plus ton exemple est assez didactique, il mériterait d'être cité dans un FAQ.

    Là où c'est vicieux dans l'architecture x86 avec l'adressage "segment:offset", celui ci permet plusieurs couples de valeurs "segment:offset" diffèrents pour une même adresse physique, quelle bande de cochon chez Intel.

  7. #7
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut Re: Bon exemple.
    Citation Envoyé par Air Marty
    Citation Envoyé par gtr
    Je prend une petite règle de plastique de 15cm, mais Segment sont les cm(0,1,2,3...14), les offsets sont les mm.
    Si je prend le Segment:Offset=0004cm:0007mm(avec ma petite règle), le 7mm est donc le 7ième mm(Offset) du 4ième cm(Segment).
    Pour y accéder directement je vais donc au 47mm
    (...)enfin c'est clair à moins que je ne me trompe...
    C'est bien cela tu as tout pigé, en plus ton exemple est assez didactique, il mériterait d'être cité dans un FAQ.

    Là où c'est vicieux dans l'architecture x86 avec l'adressage "segment:offset", celui ci permet plusieurs couples de valeurs "segment:offset" diffèrents pour une même adresse physique, quelle bande de cochon chez Intel.
    ah bon ? pourquoi vicieux ? cela est trés logique.
    en reprenant l'exemple de la régle, cela s'explique bien

    pour aller au 47mm. je peux faire :
    -> 4ieme cm (segment) et 7ime mm (offset)
    mais aussi :
    -> 1 cm (segment) et 37mm (offset)

    on peux faire n'importe comment

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Points : 22
    Points
    22
    Par défaut Re: Bon exemple.
    Citation Envoyé par nyal
    ah bon ? pourquoi vicieux ? cela est trés logique.
    en reprenant l'exemple de la régle, cela s'explique bien
    pour aller au 47mm. je peux faire :
    -> 4ieme cm (segment) et 7ime mm (offset)
    mais aussi :
    -> 1 cm (segment) et 37mm (offset)
    on peux faire n'importe comment
    Justement c'est le "on peut faire n'importe comment" qui n'aide pas le débutant à comprendre.
    C'est en effet logique mais le modèle mémoire x86 "segment:offset" n'est pas le plus simple du genre, sur diffèrentes architectures ce principe existe que ce soit sur des micro 8, 16 ou 32 bits et c'est en général + simple.
    Tu dis bien il est 3 heure 30 minutes, tu ne dis pas il est 2 H 90 minutes.

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Faut peser le pour et le contre. Il est vrai que c'est pas évident pour un débutant, mais ça peut être intéressant de le savoir.

    Toujours avec l'exemple de la règle 8) : On fait un trait tous les mm à partir de 3cm jusque 8cm. Il me parait quand même plus simple d'incrémenter uniquement l'offset(et de tester qu'il ne dépasse pas son maximum autorisé) que de calculer l'offset divisé par 10, ajouter le quotient au segment et mettre la nouvelle valeur du reste dans l'offset(je ne sais pas au niveau clocks, ce qui est le mieux).

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 15h52
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 08h45
  3. Réponses: 6
    Dernier message: 26/03/2012, 17h38
  4. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 14h31
  5. apprentissage du C est-il necessaire pour C++ ?
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 02/05/2002, 13h56

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