Page 1 sur 1

string et asm

Publié : dim. 15/nov./2009 11:02
par kwandjeen
Bonjour !!!

Je regarde ce qu'on peut faire en asm et je dois dire que je n'y comprend pas grand chose :cry:

J'essai par exemple de changer le contenu d'une chaine. Est ce que quelqu'un pourrait regarder mon code et me corriger.
C'est un truc tout bête mais il me faut des exemples pour saisir les choses (On est pas tous égaux :roll: )

Code : Tout sélectionner

string.s = "r"

!s1 db "bonjour",0
!MOV	 edx,s1
!LEA	 ecx,[v_string]

Debug string

Re: string et asm

Publié : dim. 15/nov./2009 11:34
par kwandjeen
Avec mov seulement ça fonctionne.

Code : Tout sélectionner

valeur.l = 11
valeur2.l = 35
string1.s ="r"
string2.s = "bonjour"
!mov eax,[v_valeur2]
!mov [v_valeur],eax
!mov edx,[v_string2]
!mov [v_string1],edx

Debug valeur
Debug string1

Re: string et asm

Publié : dim. 15/nov./2009 11:40
par kwandjeen
Je saisi pas certaine chose sur les mov.

Il y a mov et movs et on parle de registre EDI pour les chaines. Avec movs mon code plante et je vois pas trop la différence.

Une petite info ^^

Re: string et asm

Publié : mar. 17/oct./2017 1:57
par Ollivier
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)

Re: string et asm

Publié : mer. 18/oct./2017 10:13
par kwandjeen
Comme disait Henri Salvador : "Il s'en ai fallut de peu que ce soit à titre posthume"

Trêve de plaisanterie ;) Merci pour la réponse.

Re: string et asm

Publié : mer. 18/oct./2017 20:26
par Ollivier
De Henri Salvador, dérivons sur Salvador Dali pour souhaiter que le temps soit mou...

Il y avait un exemple ici avec SCAS:
voir procedure "Laststring"
C'est toujours le même principe pour toutes les instructions de chaînes en ASM.

Re: string et asm

Publié : lun. 18/déc./2017 17:10
par Fig
Juste une petite précision concernant LEA qui a une syntaxe déconcertante.

LEA EAX,[Adresse] est équivalent à MOV EAX,Adresse. Le [] qui correspond normalement à l'emplacement mémoire de l'adresse précisé ne fonctionne pas ainsi avec LEA.

LEA est utilisé pour faire des opérations mathématiques spécifiques de manière rapide (c'est une astuce en fait) ou plus généralement à calculer une adresse d'un tableau avec un index.

Par exemple, imaginons un tableau dont chaque case contient 2 mots de 4 octets. (donc 8 octets par case)
On souhaite accéder à la EAX-ième case du tableau et au 2eme mot.
L'adresse de début du tableau est EBX.

Code : Tout sélectionner

LEA ESI, [EBX + 8*EAX + 4]
ESI contient l'adresse qui nous interesse.
C'est équivalent à

Code : Tout sélectionner

MUL 8 ;//ou SHL EAX,3
ADD EAX,4
ADD EAX,EBX
MOV ESI,EAX

Re: string et asm

Publié : mar. 19/déc./2017 1:54
par Ollivier
Cette méthode m'a toujours séduit, et je ne l'ai jamais testé, sauf en mode réel parce que LEA n'affecte pas les drapeaux d'états arithmétiques. En tout cas, c'est une bonne astuce.

J'en profite pour poster ce lien :
https://www.strchr.com/strcmp_and_strlen_using_sse_4.2
Je ne sais pas si les instructions natives PB de chaîne utilisent ces instructions. Ça commence à dater...
Désolé : je n'ai pas eu le temps de publier le moindre code à ce sujet.