Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Discussion: MorR/M et disp16

  1. #1
    Membre Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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
    Rédacteur
    Avatar de SpiceGuid
    Homme Profil pro Damien Guichard
    Inscrit en
    juin 2007
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Nom : Homme Damien Guichard
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 576
    Points : 2 710
    Points
    2 710

    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: le cours OCaml, 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é
    Profil pro
    Inscrit en
    juin 2002
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 132
    Points : 293
    Points
    293

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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 chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 628
    Points
    628

  6. #6
    Membre Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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 chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 628
    Points
    628

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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 chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 628
    Points
    628

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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 chevronné Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 628
    Points
    628

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •