MOVS c'est un peu court.
Tu dois préciser ce que tu veux déplacer :
MOVSB : un byte
MOVSW : un word
MOVSD : un double word
MOVSQ : un quad word
Tu dois régler deux adresses :
Tu dois régler la source (anglais
Source
Index donc registre SI)
Et tu dois régler la destination (anglais
Destination
Index donc registre DI)
Tu
peux régler un compteur : registre CX, c'est le nombre de MOVS qui s'exécuteront en mode automatique.
Tu dois définir une direction : selon que t'écrives à l'endroit où à l'envers dans la mémoire.
Si t'écris à l'endroit c'est l'instruction CLD (anglais
Clear
Direction)
Si t'écris à l'envers c'est l'instruction STD (anglais
Store
Direction)
Petite astuce : 0 est considéré comme positif
1 est considéré comme négatif
Un peu comme écrire un nombre sans signe c'est positif, sinon c'est négatif (à moins que ça te passionne d'écrire des signes "+" qui servent à rien)
Petite info: si tu pars à l'envers, revient à l'endroit avant de rendre la main à PB, sinon tu crashes ton programme.
Les réglages des 3 registres SI, DI et CX doivent être écrits selon que tu bidouilles en x86-32 ou en x64 :
32bits : on rajoute le préfixe E
64bits : on rajoute le préfixe R
En mode automatique, on rajoute un préfixe REP (répéter l'opération)
ex 32 bits:
Code : Tout sélectionner
Mov ecx, 18
Mov esi, [p_mavariablesource]
Mov edi, [p_mavariabledestination]
Cld ; marche avant
Movsb ; déplace un octet
Movsw ; déplace le word qui suit l'octet
Rep Movsd ; déplace 18 longs
Std ; marche arrière
Rep Movsd ; ne fait rien...
Mov ecx, 2 ; ...car il faut rerégler le compteur
Add edi, 2; prépare le déplacement suivant
Rep Movsd ; déplace les 2 derniers des 18 longs en big endian (le déplacement des longs, pas les longs)
Cld ; Reviens en marche avant
Mais ptêt que c'est plus simple d'écrire des trucs comme a = b tout simplement...
(Et désolé pour le petit contre-temps)