Nous avons vu :
-
1. L'adressage immédiat (constante), par exemple : $12, $0b010, $0x1ABC, etc.
-
2. L'adressage registre, par exemple : %rax, %rcx, etc.
-
3. L'adressage direct, par exemple : caseB, var_a, etc.
Pour manipuler des structures de données plus complexes nous aurons besoin au minimum du mode d'adressage indirect, par exemple :
Dans cet exemple, nous avons un tableau qui contient des valeurs de 16 bits (2 octets). Cet extrait de programme ajoute la valeur 1 au premier élément et fait pointer rsi sur l'élément suivant. On comprend bien ici le rôle des parenthèses qui entourent le nom du registre :
-
%rsi désigne le contenu du registre rsi
-
alors que (%rsi) désigne le contenu de la case mémoire dont l'adresse est contenue dans rsi.
Ce concept est fondamental pour la compréhension du fonctionnement des structures de données dans tous les langages de programmation.
Nous pouvons maintenant écrire quasiment tout algorithme avec les seuls concepts, registres et instructions que nous avons vus jusqu'à présent.
Autrement dit, on peut concevoir un compilateur pour n'importe quel langage évolué qui produirait du code composé uniquement des instructions, registres et modes d'adressages expliqués ci-dessus. Nous aurions même pu nous passer de certaines instructions ou registres.
Ce qui va suivre peut malgré tout permettre d'écrire des exécutables considérablement plus compacts et efficaces.