Chaque emplacement de la mémoire d'un ordinateur possède une adresse mémoire unique. Si vous connaissez l'adresse de l'emplacement qui vous intéresse, vous pouvez accéder au contenu de cet emplacement mémoire. Dans de nombreux systèmes informatiques, chaque octet de mémoire a une adresse unique, mais ce n'est pas vrai pour tous les ordinateurs. Par exemple, j'ai travaillé sur des ordinateurs centraux dans lesquels chaque mot de mémoire avait une adresse unique, et chaque mot avait une longueur de 60 bits.
Cela dit, pour le reste de cette discussion, concentrons-nous sur les microprocesseurs grand public utilisés dans les PC, et disons que chaque octet de mémoire a une adresse unique.
Premièrement, considérez les adresses de rue sur les maisons. Si vous voulez diriger quelqu'un vers une maison spécifique, vous avez quelques choix :
- Adresse absolue
- Donnez-lui l'adresse exacte de la maison qui est sa destination finale. Quel que soit leur point de départ, ils seront en mesure de trouver la maison. C'est ce qu'on appelle l'adressage absolu.
- L'adressage relatif
- Donnez-leur l'adresse exacte d'une maison située au bout de la rue de destination, puis dirigez-les vers la maison de destination finale en disant quelque chose comme "puis allez deux maisons vers le nord, et vous êtes arrivés." C'est ce qu'on appelle l'adressage relatif, ou l'adressage base/écart. L'adresse de base, dans ce cas, est l'adresse de la maison au coin de la rue, et le décalage est le nombre de maisons à parcourir à partir de là, avant d'atteindre la maison de destination.
- Disons que vous savez que la personne est déjà quelque part dans la bonne rue de destination, et que vous savez où elle se trouve. Vous pouvez alors lui donner le nombre de maisons qu'elle doit parcourir, et une direction sur la rue à suivre, afin d'atteindre la maison de destination finale. Il s'agit d'un autre exemple d'adressage relatif, ou d'adressage base/offset. L'adresse de base, dans ce cas, est l'emplacement la de la personne en ce moment, et le décalage est le nombre de maisons à parcourir à partir de là, avant d'atteindre la maison de destination.
Maintenant, pensez à chaque maison de la rue comme à un octet de mémoire informatique. Chacune a une adresse unique. Si vous regardez les adresses d'octets adjacents, vous voyez qu'elles augmentent dans une direction et diminuent dans la direction opposée, comme les adresses des maisons dans une rue.
Si vous connaissez l'adresse exacte de l'octet qui vous intéresse, vous pouvez utiliser cette adresse pour accéder au contenu de cet octet de mémoire. C'est l'adressage absolu - vous spécifiez l'adresse mémoire complète de l'octet qui vous intéresse.
- Exemple : Vous avez une variable globale nommée. Dans la plupart des langages de programmation polyvalents, il suffit d'utiliser le nom, qui est un alias pour l'adresse mémoire de la variable.
Si vous connaissez une adresse de base, et que vous connaissez la distance entre cette adresse de base et l'octet qui vous intéresse (c'est-à-dire le décalage entre l'adresse de base et l'octet qui vous intéresse), vous pouvez spécifier à la fois l'adresse de base et le décalage pour accéder à l'octet. C'est l'adressage relatif - vous spécifiez une adresse de base et un décalage à partir de cette adresse, pour accéder à l'octet qui vous intéresse.
- Exemple : Vous avez une variable locale nommée. Dans de nombreux langages de programmation polyvalents, il suffit d'utiliser le nom, que le compilateur (ou l'assembleur) a transformé en un alias pour le décalage à partir du début de la zone de la pile utilisée pour le stockage de la variable locale. En interne, l'adresse de base est une adresse dans la pile, et le décalage est la distance entre cet emplacement et l'emplacement de la variable locale à laquelle vous accédez.
- Exemple : Vous avez un tableau nommé d'octets. Dans de nombreux langages de programmation polyvalents, utilisez le nom du tableau et un index dans le tableau. Le compilateur (ou assembleur) a transformé le nom en adresse de base du tableau... l'adresse du premier octet du tableau. L'index que vous spécifiez devient le décalage... la distance entre cette adresse de base et l'octet qui vous intéresse.
Enfin, si vous connaissez votre adresse actuelle, et que vous connaissez la distance entre celle où vous vous trouvez et l'octet qui vous intéresse (c'est-à-dire le décalage entre l'adresse actuelle et l'octet qui vous intéresse), vous pouvez spécifier à la fois l'adresse de base et le décalage pour accéder à l'octet. Il s'agit également d'un adressage relatif - vous spécifiez un décalage à partir de l'adresse où vous vous trouvez actuellement, pour accéder à l'octet qui vous intéresse.
- Exemple : Dans les langages d'assemblage de nombreuses architectures, il existe des instructions de saut relatif. Plutôt que d'inclure l'intégralité de l'adresse mémoire cible du saut dans l'instruction, seul un décalage est placé dans l'instruction. Ce décalage est la distance, en octets, entre l'emplacement actuel (c'est-à-dire le compteur de programme ou le pointeur d'instruction actuel) et l'emplacement vers lequel vous voulez sauter. Les sauts relatifs occupent généralement moins d'espace mémoire et s'exécutent souvent plus rapidement qu'une instruction de saut qui contient une adresse mémoire complète.