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 :

MorR/M et disp16


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut MorR/M et disp16
    Bonjour,

    J'aimerais savoir dans le cas où un octet ModR/M indique "disp16" (mod=0 et r/m=6) comment il faut interpréter les deux octets qui suivent ?

    Est-ce que c'est une adresse relative à un segment ou bien un décalage par rapport à IP (comme dans un CALL par exemple) ?

    Merci.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut Vieux souvenirs à confirmer ou infirmer
    Il m'est avis que c'est une adresse relative à un segment, par exemple si c'est un saut c'est une adresse relative à CS, si c'est une lecture/écriture c'est une adresse relative à DS.

    D'autre part le déplacement est non-signé ce qui permet d'accéder à la totalité du segment.

    http://matthieu.benoit.free.fr/cross...ers_manual.htm
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    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
    Bonjour.

    Pour avoir une réponse à ce genre de question, je conseille de consulter la référence officielle, c'est-à-dire la documentation technique d'INTEL.

    Pour cela, téléchargez le volume 2A du manuel à l'adresse :
    http://download.intel.com/products/p...ual/265666.pdf
    puis consultez le chapitre 2, et plus particulièrement les paragraphes 2.1.3, 2.1.4 et 2.1.5.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Merci pour les liens même si de ce que j'ai lu ça ne répond pas explicitement à ma question.
    Néanmoins je vais raisonner par logique, le but du Mod 0,1 ou 2 est de déterminer une adresse en mémoire pour accéder (ou positionner) à sa valeur, non pas une valeur de décalage. De plus, comme le souligne SpiceGuid, c'est le seul moyen rapide et concis de pouvoir accéder à toutes les adresses d'un segment
    J'en déduis donc que si le ModR/M indique un simple disp16 alors il s'agit d'un Offset mémoire relatif au Segment présent dans le registre DS (sauf si un préfixe de segment est présent) ?
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Merci mais je connais déjà ce lien par cœur et il n'est pas plus explicite que les autres, malheureusement.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    faut regarder le tableau tout en bas. il explique très bien je trouve. lorsque l'on a les deux bits mod à 00, et la valeur des trois bits r/m à 110, faut s'attendre à ce que les 2 octets qui suivent soient un displacement de 16 bits para rapport au segment ds, ou autre si préfixe de segment.

    dans le cas du disp16 lorsque mod=10, il s'agit d'un displacement par rapport à l'adresse effective extraite des registres de pointeurs.

    s'il n'y à pas de pointeur, seul le disp16 est present et sera relatif à un segment. les adresses sont toujours relatives à des segments (explicites ou implicites).

    il s'agit d'un octet utilisé pour les opérandes de type données, et non adresses.
    les adressages, c'est justement l'octet mod/rm qui les décrit.

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Sauf que ce serait le seul cas où disp16 est utilisé comme ça. En effet si j'ai bien compris, lorsque Mod=10 la valeur de disp16 est ajouté à celles d'un ou deux registres (BX, BP, SI ou DI) et à ce moment là la valeur est signée (contrairement à un offset d'adresse qui est non-signé).
    Je suis loin de renier le fait que ce soit une exception, c'est justement ce fait que j'essaie d'établir avec certitude et jusqu'à présent je n'ai pas trouvé de littérature à ce sujet corroborant cet état de fait.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  9. #9
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    signé ou non, ça change rien, l'adresse dans un segment 16 bits, ça reste du 16 bits et ne peut aucunement deborder avec un 17eme bit.

    par exemple, si bx=F000h et disp16=1000h, l'adresse effective sera 0, pas 10000h
    idem si c'est l'inverse.
    bx=1000h et disp16=F000h => adresse effective =0.

    l'interet d'avoir du signé c'est avec les disp8.

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Je suis plutôt surpris par ce que tu me dis là.
    Effectivement j'étais bien conscient qu'une adresse ne peut dépasser les 16bits ce qui engendre un effet d'overflow si l'adresse passe sur 17bits ou plus mais je pensais que quand même en Mod=10, le disp16 restait signé afin de pouvoir faire des décalages plus grand que -127/+127.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  11. #11
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    il est signé. la logique signée, c'est la même que la non signée. sauf que l'une utilise overflow pour signifier un dépassement des limites signées, et la retenue pour les dépassements purs et dur (17eme bit). là, que la valeur 16 bits soit signée, ou pas, ça change rien, de toutes façon, on additionne les adressess 16 bits comme n'importe quelle addition, sauf que là, les dépassements sont ignorés, ce qui revient à boucler l'espace d'adressage 16 bits.

    mais une addition se fiche que les valeurs soient signées ou non, l'addition additionne deux valeurs binaires. Ce qui permet d'avoir une logique signée, c'est les drapeaux mis à jour lors des opérations.

    pour les disp8, une extension de signe vers un disp16 est surement effectuée avant le calcul de l'adresse effective.

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