Bonjour
Une case mémoire peut être considérée comme une variable.
Lorsqu'en C on fait un a = b; on fait un déplacement mémoire
en assembleur cela donnerait :
mov eax,[a]
mov [b], eax
on est obligé de passer par l'intermédiaire d'un registre la plupart du temps car il n'y a que très peu d'opérations de transfert direct en mémoire.
La différence essentielle entre un registre et la mémoire est sa rapidité d'accès et sa polyvalence.
On peur par exemple mettre un compteur de boucle en mémoire ou dans un registre. L'utilisation du registre ecx accélèrera le calcul.
Seul un registre peut servir de pointeur
soit en C :
char tamp[16];
char *puc;
int i;
puc = tamp
for (i=0; i < 16; i++)
{
if (*puc++ == 0)
break;
}
donnerait en asm
lea esi, [tamp] ; charge le pointeur (puc) dans le registre esi
mov ecx, 16 ; charge le nombre de passages dans la boucle
lbl1: mov al,[esi] ; charge le caractère courant dans al (*puc)
; lodsb marche très bien aussi
cmp al, 0 ;le compare à 0 -> or al, al marche très bien aussi
jz lbl2 ; branche au lbl2 si nul (break)
inc esi ; incrémente le pointeur (puc++) inutile avec lodsb
dec ecx ; décrémente le compteur
jnz lbl1 ; boucle tant que pas fini
lbl2: ; suite
un registre tel al ne peut contenir qu'un octet il faut donc utiliser la mémoire pour mettre ses variables.
l'énorme avantage de l'assembleur, c'est qu'il n'y a pas de type. Il ne connait que des suites d'octets, on peut donc les manipuler comme on veut, mais il faut que cela soit bien clair dans la conception du programme auparavant sinon le segmentation fault revient souvent.
tout cela peut paraitre confu, mais si on a pas bien compris la manipulation des pointeurs en C, c'est difficile de faire de l'assembleur, où on passe son temps à en manipuler.
Cordialement