begin process at 2008 09 05 18:23:02
1 237 429 membres
369 nouveaux aujourd'hui
14 313 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Utilisation inline du C [ Processeurs / X86 ] (frozon)

Utilisation inline du C le 20/01/2007 11:19:13

frozon
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


Re : Utilisation inline du C le 20/01/2007 13:19:13

BruNews
(Admin CS)
Réponse acceptée !

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++


Re : Utilisation inline du C le 20/01/2007 15:40:53

frozon
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.



Re : Utilisation inline du C le 20/01/2007 16:06:21

BruNews
(Admin CS)
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++

Re : Utilisation inline du C le 20/01/2007 16:18:50

frozon
Merci pour ta reponse encore une fois ;)




Classé sous : char, src, inline, len, dst

Participer à cet échange

Livres en rapport

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS