Accueil > Forum > > > > Inversion de chaîne
Inversion de chaîne
lundi 18 décembre 2006 à 18:02:31 |
Inversion de chaîne

Bidou
|
Bonjour à tous, A vrai dire je suis plutôt nouveau en asm et pas très bon lol. Mais bon, faut bien commencer un jour hein. Pour me faire la main, j'ai écrit une petite méthode qui permet d'inverser une chaîne de caractère... J'aimerais savoir si on peut faire mieux (sûrement que oui) et que les connaisseurs me corrigent  Merci d'avance int reverseStr(char str1[], char str2[]) { int len = -1;
__asm { XOR EAX, EAX // Current char XOR EBX, EBX // Counter XOR EBX, [len] XOR ECX, ECX XOR EDX, EDX MOV ESI, [EBP+8] // Reference (1st string) MOV EDI, [EBP+12] // Reference (2nd string) LoopStr: INC EBX MOV AL, [ESI+EBX] CMP AL, 0 JNE LoopStr // Save length MOV len, EBX MOV [EDI+EBX], '\0' MOV EDX, EBX DEC EDX LoopRev:DEC EBX MOV ECX, EDX MOV AL, [ESI+EBX] SUB ECX, EBX MOV [EDI+ECX], AL CMP EBX, 0 JNE LoopRev } return len; }
-Blog-
|
|
mardi 19 décembre 2006 à 20:37:22 |
Re : Inversion de chaîne

BruNews
|
Calcul de longueur est totalement inutile, une chaine doit finir par un 0, suffit de mettre un pointeur sur le dernier char.
Cette routine se fait tranquille avec les 3 registres généraux et donc rien à PUSHer POPer. Mettre de l'asm dans une fonction en C est la pire des solutions, ça empêche toute optimisation du compilo. Si on la fait en asm alors FULL asm ou rien.
__declspec(naked) void __fastcall bnRevStr(char *psz) { // ECX = psz __asm { cmp byte ptr[ecx], 0 mov eax, ecx je short revEXIT goOUT: add ecx, 1 cmp byte ptr[ecx], 0 jne short goOUT goREV: sub ecx, 1 cmp eax, ecx jae short revEXIT mov dl, [eax] mov dh, [ecx] mov [eax], dh mov [ecx], dl add eax, 1 jmp short goREV revEXIT: ret 0 } }
void __stdcall TesteReverse() { char buf[28]; strcpy(buf, "salut la foule"); MessageBox(0, buf, "ok", 0); }
#pragma comment(linker, "/entry:myWinMain") __declspec(naked) void __stdcall myWinMain() { __asm { call TesteReverse push 0 call dword ptr ExitProcess } }
ciao... BruNews, MVP VC++
|
|
mardi 19 décembre 2006 à 20:39:08 |
Re : Inversion de chaîne

BruNews
|
OUPS, oublié d'appeler la routine:
void __stdcall TesteReverse() { char buf[28]; strcpy(buf, "salut la foule"); bnRevStr(buf); MessageBox(0, buf, "ok", 0); }
ciao... BruNews, MVP VC++
|
|
mardi 19 décembre 2006 à 21:24:30 |
Re : Inversion de chaîne

BruNews
|
Réponse acceptée !
J'avais lu ta question comme d'hab un peu trop vite... Tu voulais une inversion mais dans un autre buffer. La routine retournera non pas la longueur qui risquerait fort de ne pas servir à grand chose mais plutot le terminateur null final, permettra un chainage direct si besoin et la longueur peut être sue illico aussi (fin - deb comme fait dans la routine):
__declspec(naked) char* __fastcall bnCpyRevStr(char *pdst, char *psrc) { // ECX = pdst, EDX = psrc __asm { mov eax, ecx cmp byte ptr[edx], 0 je short cpyrevEXIT mov ecx, edx mov [esp-4], ebx goOUT: add edx, 1 cmp byte ptr[edx], 0 jne short goOUT mov ebx, edx sub edx, ecx ;// len = c - psrc sub ebx, 1 fromSRC: mov cl, [ebx] mov [eax], cl sub ebx, 1 add eax, 1 sub edx, 1 jnz short fromSRC mov ebx, [esp-4] cpyrevEXIT: mov byte ptr[eax], 0 ret 0 } }
void __stdcall TesteReverse() { char buf[28]; bnCpyRevStr(buf, "salut la foule"); MessageBox(0, buf, "ok", 0); }
#pragma comment(linker, "/entry:myWinMain") __declspec(naked) void __stdcall myWinMain() { __asm { call TesteReverse push 0 call dword ptr ExitProcess } }
ciao... BruNews, MVP VC++
|
|
mardi 19 décembre 2006 à 21:29:44 |
Re : Inversion de chaîne

Bidou
|
Merci bien Brunews... A vrai dire, cette synthaxe ne m'est pas encore tout à fait familière, va falloir que je regarde en détail 
-Blog-
|
|
Cette discussion est classée dans : mov, xor, edx, ecx, ebx
Répondre à ce message
Sujets en rapport avec ce message
j'ai un prob avec mon buffer ; ya pas d'amuses gueules (masm32) [ par papiboff ]
bj si je mets le buffer "somme " en dd avec charge eax et que j'ajoute deux 'dec ebx ' , ben , marche pas correctement ; (pêrqué ???? = en french) sv
Aligner des données pour le SSE [ par epineurien ]
Bonjour à tous !J'ai un petit problème avec du code dont je mesure la vitesse: suivant la compilation, la vitesse varie du simple au double .J'expliqu
nombre premier en nasm [ par YAWLY ]
MED.MERZOUG salut tout le monde vous pouvez m'aider si j le compile sa affiche chaque fois le nbr est non premeir > le code est : Section .date ch
aide pour code [ par marooh ]
Bonjour, j'ai un code assembleur qui permet de trouver le maximum d'un tableau.En le compilant, la premiere phase passe avec succès mais en créant l
fatal error LNK1190 [ par WildChild54 ]
Bonjour à tous!Eh bien voilà, je voudrais créer un petit programme affichant l'heure (je sais il y en a déjà plusieurs qui en ont parlé ici) mais j'ai
[ASM] Strcmp, prob evec la valeur de retour. [ par Ilsundal ]
Bonjour a tous, j'ai réaliser la fonction strlen en ASM x86. tout fonctionne parfaitement sauf pour la valeur de retour, je souhaiterait qu'elle corre
mon code ne marche pas [ par mohoguess ]
Bonjour a tous,je suis débutant en asembleur, et j'ai écrit un code qui sert a additionner le chiffre 1 jusqu'à 999999 fois (mon code ne sert à rien j
un énorme travail de votre part [ par mana ]
bonjour, voici un programme écrit en c++ (il permet de passer d'une image en couleur 24bits(ARGB) a une image en 256 niveaux de gris(toujours sur 24bi
Resultat de la vitesse des : Registre, instruction, calcul, et mémoire ! ! ! [ par rebixav ]
Voici la liste que j'ai créé : asm : ( inc ) = 0.065 asm : ( and ) = 0.08 asm : ( or ) = 0.08 asm : ( xor ) = 0.08 asm : ( not )
Pb registre DL [ par AlexMAN ]
Bonjour, J'ai un ptit pb avec le code qui suit, au nivo du mov dl, [ecx] ://Renvoie pointeur sur fin de chaine (permet d'eviter l'utilisation de strca
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|