Utilisation inline du C

Résolu
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008 - 20 janv. 2007 à 11:19
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008 - 20 janv. 2007 à 16:18
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2007 à 13:19
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++
3
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008
20 janv. 2007 à 15:40
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2007 à 16:06
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++
0
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008
20 janv. 2007 à 16:18
Merci pour ta reponse encore une fois ;)
0
Rejoignez-nous