- un mode d'adressage court utilise une adresse relative, calculée comme (certains registre + quelques s constant mallish), qui permet généralement de petites/quelques/rapides instructions, mais ne peut s'adresser qu'à une petite plage de mémoire;
- Un mode d'adressage long utilise des adresses absolues, lesquelles requièrent généralement des instructions grandes/nombreuses/lentes, mais qui peuvent accéder à n'importe quelle mémoire.
Je donnerai un exemple de code ARM, mais cela s'applique probablement (au sens général) à de nombreux autres processeurs.
Chaque instruction ARM (ignorant Thumb) a une longueur de 32 bits, et dans l'intérêt de cet exemple, nous allons prétendre que l'ARM peut accéder à un espace d'adressage de 32 bits.
Chaque instruction doit être décodée, essentiellement en décomposant ces 32 bits en divers champs - et certains de ces bits doivent être utilisés pour stocker le type de l'instruction.
Espérons donc, il devrait être clair que vous ne pouvez pas charger une adresse arbitraire dans un registre dans une instruction:
MOV Rn, #AABBCCDD
Ne fonctionne pas - puisque nous devons utiliser bits pour spécifier l'instruction (MOV) et le registre de destination (Rn), il ne nous reste plus que 32 bits pour stocker une adresse 32 bits.
Donc, si nous voulons que l'adresse de quelque chose dans un registre, nous avons quelques options:
1. Utilisez PC-relatifs
Il y a une pseudo-op qui fonctionne comme suit:
ADR Rn, .label
...
.label
qui obtient étendu à:
ADD Rn, PC, (.label - here)
Fourni .label est dans environ 4k de l'instruction en cours, nous pouvons ajouter/soustraire du PC actuel (compteur de programme) pour obtenir cette adresse. C'est une adresse relative.
2. Utilisez plusieurs instructions
Vous pouvez construire une adresse arbitray en utilisant permet d'ajouter ou ORS:
MOV Rn, #AA000000
ADD Rn, Rn, #00BB0000
ADD Rn, Rn, #0000CC00
ADD Rn, Rn, #000000DD
(En fait, vous pouvez le faire beaucoup plus efficacement, mais vous voyez l'idée) .
3.Stocker l'adresse absolue dans un endroit relativement connu
Si vous connaissez l'adresse que vous voulez est à proximité stockée, vous pouvez le charger de la mémoire:
ADR Rn, .store
LDR Rn, [Rn]
.store
EQU #AABBCCDD
Maintenant, d'autres architectures de traitement peuvent avoir des instructions de longueur variable (par exemple x86), vous pouvez donc choisir d'utiliser un mode d'adressage relatif court (par exemple par rapport à un PC ou un autre registre), ou une instruction plus longue (et probablement) plus lente qui contient une adresse entière de 32 bits.
Quelle architecture de processeur? Des choses comme celles-ci sont spécifiques au processeur. –
freescale sc140 –