QCM Modes d'adressage

De Ensiwiki
Aller à : navigation, rechercher

1. On peut obtenir l'adresse du registre %eax avec

$eax
Cette notation n'a pas de sens en assembleur (sous GDB, $eax désigne le registre %eax par contre)textuel, proche du langage machine.
On ne peut pas, %eax n'a pas d'adresse
Un registre fait partie du processeur, pas de la mémoire
(%eax)

2. Si %eax contient une adresse, après avoir exécuté « movl (%eax), %eax », %eax peut contenir

Une adresse
La valeur pointée par %eax peut être une adresse (mais pas toujours)
La valeur pointée par %eax
C'est toujours le cas, par définition
L'adresse de %eax
Cf. question précédente, ça n'a pas de sens

3. Si %ecx contient la valeur -42, cochez les instructions équivalentes à movl (%eax), %ebx

movl 0(%eax), %ebx
movl %eax, %ebx
Attention, les parenthèses ont une signification bien précise ici (indirection)
movl 42(%eax, %ecx), %ebx
movl 42(%ecx, %eax), %ebx
Dans ce mode d'adressage, permutter les deux registres ne change pas le résultat.
movl 42(%eax, %ecx, 2), %ebx
movl 21(%eax, %ecx, 2), %ebx
Ce mode désigne la case mémoire d'adresse %eax + (%ecx * 2) + 21 = %eax - 63
movl 84(%eax, %ecx, 2), %ebx
Oui, car %eax + (%ecx * 2) + 84 = %eax

4. L'instruction movl X(%eax, %ebx, 4), %ecx est équivalente à :

movl %ebx, %ecx
shll $2, %ecx
addl %eax, %ecx
addl $X, %ecx

movl %ebx, %ecx
shll $2, %ecx
addl %eax, %ecx
addl $X, %ecx
movl (%ecx), %ecx

movl %ebx, %ecx
shll $2, %ecx
addl %eax, %ecx
addl X, %ecx
movl (%ecx), %ecx

5. Si une structure de liste est définie par :

struct list {
    int elem;
    struct list *suiv;
};

et si le pointeur %eax pointe sur une liste l, alors on peut mettre l->suiv dans le registre %ebx avec :

movl 4(%eax), %ebx

movl %eax, %ebx
addl $4, %ebx

movl %eax, %ebx
addl $4, %ebx
movl (%ebx), %ebx

leal 4(%eax), %ebx
movl (%ebx), %ebx

6. Si l'étiquette X est définie par X: .byte 42, cochez les instructions qui risquent de provoquer une erreur (Segmentation Fault) à l'exécution :

movl X, %eax
On fait une indirection sur X, de taille 32 bits, alors que X ne fait que 8 bits. On ne sait pas si il y a quelque chose derrière X ...
movl $X, %eax
Cette instruction charge la valeur de l'étiquette, c'est à dire l'adresse de l'endroit où elle est définie, dans %eax
movb X, %al
Cette instruction va charger 42 dans %al.

Votre pointage est 0 / 0