Bonjour à tous,
Comment trouver l'offset d’un octet dans la mémoire RAM ?
Merci d'avance pour vos réponses.
Bonjour à tous,
Comment trouver l'offset d’un octet dans la mémoire RAM ?
Merci d'avance pour vos réponses.
Bonjour,
Ça n'a pas de sens : c'est ton micro-processeur demande à lire ou écrire à une adresse donnée par lui, en affichant les bonnes valeurs sur ses bus d'adresse et de donnée. Après, à cette adresse, il peut se trouver n'importe quoi : le plus souvent ce sera de la RAM, mais cela peut-être également de la ROM, des périphériques ou… rien, auquel cas la valeur lue sera indéfinie (généralement 0xFF) et la valeur écrite sera perdue.
Le fait que de la RAM, de la ROM, un périphérique ou du vide se trouve à une adresse donnée est déterminée par la conception de la machine, dans laquelle on implante différents composants qui reçoivent tous, en même temps, les informations des bus d'adresse et de données mais qui sont faits pour ne réagir qu'à certaines combinaisons de ceux-ci.
Bonjour,
Effectivement, la question posée n'a pas de sens telle qu'elle est posée.
D'abord, l'emploi du terme " offset " est-il volontaire ?
C'est un terme technique bien précis, en liaison avec l'adressage des microprocesseurs appartenant à la famille Intel x86.
Pour ces microprocesseurs, une adresse en mémoire est obtenue à l'aide d'une adresse de segment et d'un décalage ( " offset " en anglais ).
La question posée devient alors " Comment trouver le décalage d’un octet dans la mémoire RAM ? " et n'est toujours pas claire.
Si la question signifie " Un octet étant donné, comment trouver son adresse dans une plage de mémoire ? ", alors elle a un sens.
Il existe en effet une instruction en Assembleur x86 pour chercher un octet dans une zone de mémoire.
C'est l'instruction SCASB précédée du préfixe REPNE.
L'octet cherché doit être placé dans le registre AL, la zone de mémoire doit commencer à l'adresse ES:EDI ( en mode 32 bits ) et la taille en octets de la zone de recherche doit être placée dans le registre ECX.
L'exécution de l'instruction REPNE SCASB permettra de trouver la première occurrence de l'octet cherché, si cet octet se trouve dans la zone de mémoire explorée.
Si ECX est nul après l'exécution de l'instruction, ou si le flag ZF est à 0, c'est que l'octet n'a pas été trouvé.
Sinon, il se trouve à l'adresse ES:EDI.
Pour être complet, ajoutons que :
- on peut choisir le sens de la recherche ( adresses croissantes ou décroissantes ), à l'aide du flag DF ;
- en mode protégé, il n'y a pas besoin de se préoccuper du registre de segment ES car Windows utilise un modèle de mémoire ( dit " Flat " ) où les segments ont tous leur adresse de base à 0 et leur taille à 4 Go ;
- en mode protégé, l'adresse obtenue est une adresse virtuelle ;
si la pagination est activée, et c'est toujours le cas pour Windows en mode protégé, l'adresse virtuelle n'est pas l'adresse réelle dans la RAM ;
convertir l'adresse virtuelle en adresse réelle est un problème délicat, qui demande de longues explications ;
le lien http://sos.enix.org/wiki/upload/SOSD...texte-art4.pdf est une bonne introduction à ce dernier point.
D'ailleurs, la question posée initialement pourrait s'interpréter en " Comment trouver l'adresse réelle d'un octet dans la mémoire RAM ? ".
Dans ce cas, la discussion est loin d'être close.
En résumé, il serait bon que la question soit reformulée avec plus de précision ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager