Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/03/2012, 10h18   #1
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 13h59   #2
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 514
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 514
Points : 2 498
Points : 2 498
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 projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 14h17   #3
Prof
Membre confirmé
 
Inscription : juin 2002
Messages : 113
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2002
Messages : 113
Points : 217
Points : 217
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.
Prof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 18h17   #4
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 20h02   #5
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
http://ref.x86asm.net/coder32.html#modrm_byte_16
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 20h08   #6
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 20h26   #7
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
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.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/03/2012, 20h37   #8
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 20h48   #9
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
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.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/03/2012, 09h31   #10
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2012, 20h34   #11
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
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.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h25.


 
 
 
 
Partenaires

Hébergement Web