Introduction à la programmation en assembleur (processeurs 64 bits de la famille 80x86)
4.4. Indexations complexes

Dans le même esprit, on pourra écrire -5(%rsi, %rax) pour désigner le contenu de la case mémoire pointée par rsi+rax-5. Comme nous avons vu ci-dessus, le calcul est réalisé par le processeur : rsi et rax restent inchangés lors d'une telle opération.

Il faut noter que les deux registres doivent être de même taille.

Définition

Ici %rsi est appelé « base » et %rax est appelé « index ». La taille des deux registres dépend donc du type de processeur (16, 32 ou 64) et du type de système d'exploitation : un système GNU/Linux ou Windows 32 bits ne permettra pas d'utiliser les caractéristiques 64 bits d'un processeur 64 bits.

Il existe un mode d'adressage encore plus puissant : 5(%rdi, %rbx, 8) désigne ainsi le contenu de la mémoire dont l'adresse est calculée par : rdi+(rbx*8)+5.

Exemple

Reprenons l'exemple de la section 4.3. et supposons que rsi pointe sur la première fiche d'un tableau de fiche et que rbx contient le numéro de la fiche courante :

movb 4(%rsi, %rbx, 8), %al # Fiche[rbx].age -> %al

Cette instruction aura pour effet de copier dans al, la valeur pointée par rsi+(rbx*8)+4, c'est à dire l'adresse du champ « âge » de la fiche numéro %rbx.

Définition

Ici, la valeur 8 est appelée « scale factor ». Ce champ peut prendre uniquement les valeurs 1, 2, 4 ou 8 qui correspondent aux tailles octets, mot de 16 bits, mot de 32 bits et mot de 64 bits.