TP2: Exemples de code avec manipulations mémoire
# 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.
# 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
# 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.