Introduction
Cet exercice renvoie à la section 4.2 du cours "Mode d'adressage indirect".
Ce petit programme permet de copier, octet par octet, une chaîne de caractères terminée par 0, dont l'adresse est contenue dans le registre rsi vers une deuxième chaîne de caractères dont l'adresse est contenue dans le registre %rdi.
Remplacez chaque point d'interrogation par un caractère pertinent. Si nécessaire, vous pouvez aussi supprimer des points d'interrogation.
-
Vous pouvez télécharger le fichier .txt ci-dessous pour réaliser l'exercice.
-
Ligne 1, Colonne 1 : Il faut une étiquette, car c'est le début de l'itération (copie d'un caractère)
-
Ligne 1, Colonne 2 : Suffixe b, car la valeur copiée est un octet (8bits)
-
Ligne 1, Colonne 3 : Il faut des parenthèses pour indiquer que la donnée à copier ne se trouve pas directement dans %rsi mais à l'adresse contenue dans %rsi
-
Ligne 1, Colonne 4 : Il faut supprimer les ? : l'octet pointé par %rsi est copié directement dans %al
-
Ligne 2, Colonne 2 : Suffixe b, car la valeur copiée est un octet (8bits)
-
Ligne 2, Colonne 3 : Il faut supprimer les ? : la valeur à copier est contenue directement dans %al
-
Ligne 2, Colonne 4 : Il faut des parenthèses pour indiquer que la valeur ne doit pas être copiée directement dans %rdi mais à l'adresse contenue dans %rdi
-
Ligne 3, Colonne 2 : 'jz' : si l'octet qui vient d'être copié est égal à 0, la chaîne de caractère d'origine est terminée, il faut donc sortir de la boucle.
-
Ligne 3, Colonne 3 : Adresse symbolique définie à la ligne 7, c'est à dire à la sortie de la boucle.
-
Ligne 4, Colonne 1 : Supprimer les ? : cette adresse indique le début de l'incrémentation des registres, mais n'étant pas utilisée comme cible d'un saut, il est parfaitement inutile de lui donner un nom.
-
Ligne 4, Colonne 2 : Suffixe b, car la valeur ajoutée est sur un octet (8bits)
-
Ligne 4, Colonne 3 : « $1 » : valeur constante désignant la taille (1 octet) de l'objet que l'on vient de copier, qu'il faut ajouter au registre %rsi pour qu'il pointe sur le prochain octet à copier
-
Ligne 4, Colonne 4 : Supprimer les ? : C'est bien l'adresse qu'il faut augmenter et cette adresse est contenue directement dans %rsi
-
Ligne 5, Colonne 2 : Suffixe b, car la valeur ajoutée est sur un octet (8bits)
-
Ligne 5, Colonne 3 : « $1 » : valeur constante désignant la taille (1 octet) de l'emplacement où l'on a copié, qu'il faut ajouter au registre %rdi pour qu'il pointe sur le prochain emplacement de 8 bits
-
Ligne 5, Colonne 4 : Supprimer les ? : C'est bien l'adresse qu'il faut augmenter et cette adresse est contenue directement dans %rdi
-
Ligne 6, Colonne 3 : Etiquette définie en ligne 1
-
(1) Copie de l'octet [movb] pointé [()] par le registre 64 bits %rsi dans le registre 8 bits %al.
-
(2) Copie de l'octet contenu dans %al à l'emplacement pointé [()] par le registre 64 bits %rdi. Note : %al joue le rôle de registre intermédiaire car la copie directe d'une valeur pointée vers une valeur pointée n'est pas implémentée dans les processeurs de la famille 80x86
-
(3) Si l'octet courant, contenu dans %al est égal à zéro (ZF=1), la copie est terminée (poursuite de l'exécution du programme à la ligne 7). Sinon (ZF=0), l'exécution se poursuit à la ligne 4.
-
(4) L'adresse d'origine (contenue dans %rsi) de la copie est augmentée de 1. Autrement dit, %rsi pointe sur le prochain octet à copier.
-
(5) L'adresse de destination (contenue dans %rdi) de la copie est augmentée de 1. Autrement dit, %rdi pointe sur le prochain octet à modifier.
-
(6) Retour à la ligne 1, c'est à dire copie de l'octet pointé par la nouvelle valeur de %rsi à la nouvelle adresse contenue dans %rdi.
-
(7) Fin de la copie. Cette ligne ne peut être atteinte que lorsque ZF=1 à la ligne 3.