string et asm

Pour discuter de l'assembleur
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

string et asm

Message 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
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: string et asm

Message 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
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: string et asm

Message 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 ^^
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: string et asm

Message 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)
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: string et asm

Message 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.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: string et asm

Message 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.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: string et asm

Message 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
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: string et asm

Message 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.
Répondre