Utilisation inline du C [Résolu]

Signaler
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008
-
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008
-
Bonjour,

Apres avoir essayé quelque petit chose, j'ai voulu essayé quelque chose.
J'ai fait un programme avec une fonction comme celle ci:
void copy(char *src, int len, char *dst)
Ce que j'aimerai faire maintenant c'est l'appeler a patir d'un peu d'asm inline du genre:
char *dst;
char *src = "bonjour\r\n";
int len = strlen(src);
__asm {
    push [dst]
    push len
    push [src]
    call copy
}
Mais bien sur c'est trop facile comme ca, ca ne marche pas.
Je pense qu'il fodrai recupérer le l'offset de mes deux string pour les passer en parametre mais je ne vois pas comment.
Si quelqu'un pouvait me donner un petit coup de  main ce serai super.

Merci d'avance

4 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
Fichier McrAsm.h
#ifndef MCRASM_H
#define MCRASM_H


#ifndef BNINLINE
#ifdef __cplusplus
#define BNINLINE inline
#else
#define BNINLINE __inline
#endif /* __cplusplus */
#endif /* BNINLINE */


BNINLINE char* bnstrcpy(char *dst, char *src) // return ptr sur NULL final
{
  __asm {
    mov   eax, dst
    mov   ecx, src
    dec   eax
LcpyLoop:
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jz    short LcpyOut
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jz    short LcpyOut
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jnz   short LcpyLoop
LcpyOut:
  }
}


#endif

Te reste à ajouter
#include "McrAsm.h"
dans les modules qui voudront utiliser bnstrcpy().

Exemple:
char szA[] = "Salut";
char szB[] = " la foule";

char buf[48], *c;
c = bnstrcpy(buf, szA);
bnstrcpy(c, szB);

qu'on pourra condenser en:
bnstrcpy(bnstrcpy(buf, szA), szB);

ciao...
BruNews, MVP VC++
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008

Rien a dire a part merci beaucoup.
Je regarde tes sources sur cppfrance depuis ta reponse sur mon autre question je di chapeau.
Tes sources sont tres claire et optimisé.
Merci pour tes réponses.

J'ai une derniere question un peu Hors Sujet par rapport au sujet de cette discussion.
Imaginons que je veuille appeler une fonction qui se situe a 0x454545 en memoire
Quand ds mon code je fait
__asm {
    push args
    call 0x454545
}
Il n'en est pas fan, pourrais tu s'il te plait m'expliquer la syntax a respecter pour ce genre de call.

Je te remerci encore une fois brunews pour tes réponses.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
mov eax, adresse
call eax

le ompilo n'aura rien à redire à ça mais reste à savoir si sera cohérent, tu en seras seul responsable.

ciao...
BruNews, MVP VC++
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008

Merci pour ta reponse encore une fois ;)