|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() ![]() Inscription : novembre 2007 Messages : 1 519 ![]() |
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 -
|
|
|
00
|
|
|
#2 |
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 514 ![]() |
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 projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
|
00
|
|
|
#3 |
|
Membre confirmé
![]() Inscription : juin 2002 Messages : 113 ![]() |
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. |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : novembre 2007 Messages : 1 519 ![]() |
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 -
|
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
|
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : novembre 2007 Messages : 1 519 ![]() |
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 -
|
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
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. |
|
|
10
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : novembre 2007 Messages : 1 519 ![]() |
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 -
|
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
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
![]() ![]() Inscription : novembre 2007 Messages : 1 519 ![]() |
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 -
|
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
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. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com