TP2: Exemples de code avec manipulations mémoire

Incrémentation via pointeur

# p = &x # ... # (*p)++ irmovl x,%eax # p = &x rmmovl %eax,p ... mrmovl p,%eax mrmovl (%eax),%ebx # *p iaddl 1,%ebx # ++ rmmovl %ebx,(%eax) halt .pos 0x100 p: .long 0 x: .long 0

On utilise ici un pointeur: la première instruction charge dans eax l'adresse désignée par l'étiquette x, donc en fait la constante 0x104, que l'on range ensuite dans la variable p. Plus tard, on peut relire p (qui aura éventuellement changé), et l'on utilise des parenthèses pour effectuer lectures et écritures à l'adresse récupérée depuis p.

Incrémentation (bis)

# p = &x # ... # a = *(p++) irmovl x,%eax # p = &x rmmovl %eax,p ... mrmovl p,%eax mrmovl (%eax),%ebx # *p rmmovl %ebx,a # a = *p iaddl 4,%eax rmmovl %eax,p # p++ halt .pos 0x100 p: .long 0 a: .long 0 x: .long 0

Décalage dans un tableau

# for (i=0;i<n-1;i++) # t[i] = t[i+1]; mrmovl n,%eax # n-i irmovl t,%ebx # p isubl 1,%eax # déjà fini ? jl end loop: rrmovl %ebx,%edx #) iaddl 4,%edx #) p+1 mrmovl (%edx),%ecx # lire *(p+1) rmmovl %ecx,(%ebx) # écrire dans *p rrmovl %edx,%ebx # p = p+1 isubl 1,%eax # décrémenter le compteur jge loop end: halt .pos 0x100 n: .long 5 t: .long 1 .long 4 .long 6 .long 4 .long 4 .long 3

Plutôt que de recalculer t + i à chaque fois, on utilise le registre ebx comme pointeur p.