Accueil > Forum > > > > Fonction DLL avec arguments
Fonction DLL avec arguments
jeudi 13 mars 2003 à 11:45:38 |
Fonction DLL avec arguments

Arnotic
|
Bonjour, J'ai une DLL avec une fonction qui prend 2 arguments (en C (char*, int). Lorsque je la charge j'ai aucun problème mais lors de l'appel à la fonction ca plante : mov myda, "test" mov lgda, 4 invoke GetProcAddress,hDLL,ADDR FuncWrite mov lpWriteData, eax push lgda push myda call lpWriteData Alors qu'une fonction sans argument j'arrive très bien à la faire fonctionner :/ Merci de votre aide. ------------------------------------------ Arnotic Mail : info@mistersp.com
|
|
jeudi 13 mars 2003 à 12:48:52 |
Re : Fonction DLL avec arguments

filter
|
> Bonjour, Bonjour,
> J'ai une DLL avec une fonction qui prend 2 arguments (en C (char*, int). 1 argument POINTEUR.
> mov myda, "test" > mov lgda, 4 Comment sont reserve lgda et myda????
> push lgda > push myda Faux. Je suppose que t'utilise le syntax de MASM, (sinon, precise lequel.). Alors essai plutot
push offset myda
-- Filter
|
|
jeudi 13 mars 2003 à 13:07:11 |
Re : Fonction DLL avec arguments

Arnotic
|
salut,
merci de ton aide je déclare : LOCAL lgda:WORD LOCAL myda:DWORD
oui effectivement j'utilise masm 8.
------------------------------------------ Arnotic Mail : info@mistersp.com
------------------------------- Réponse au message : -------------------------------
> > Bonjour, > Bonjour, > > > J'ai une DLL avec une fonction qui prend 2 arguments (en C (char*, int). > 1 argument POINTEUR. > > > > mov myda, "test" > > mov lgda, 4 > Comment sont reserve lgda et myda???? > > > push lgda > > push myda > Faux. Je suppose que t'utilise le syntax de MASM, (sinon, precise lequel.). Alors essai plutot > > push offset myda > > -- > Filter >
|
|
jeudi 13 mars 2003 à 17:46:35 |
Re : Fonction DLL avec arguments

littlefl
|
Bonjour, je connais un peu l'ASM et je pense que dans ton cas (Arnotic), on ne peut pas faire un push offset myda parce-que myda est local donc on doit faire : lea eax,myda push eax
Mais sinon, tu devrais mettre les [] autour des noms des variables, ça serait plus clair je pense.
------------------------------- Réponse au message : -------------------------------
> salut, > > merci de ton aide > je déclare : > LOCAL lgda:WORD > LOCAL myda:DWORD > > oui effectivement j'utilise masm 8. > > ------------------------------------------ > Arnotic > Mail : info@mistersp.com > > > ------------------------------- > Réponse au message : > ------------------------------- > > > > Bonjour, > > Bonjour, > > > > > J'ai une DLL avec une fonction qui prend 2 arguments (en C (char*, int). > > 1 argument POINTEUR. > > > > > > > mov myda, "test" > > > mov lgda, 4 > > Comment sont reserve lgda et myda???? > > > > > push lgda > > > push myda > > Faux. Je suppose que t'utilise le syntax de MASM, (sinon, precise lequel.). Alors essai plutot > > > > push offset myda > > > > -- > > Filter > > >
|
|
jeudi 13 mars 2003 à 19:14:02 |
Re : Fonction DLL avec arguments

filter
|
>>on ne peut pas faire un push offset myda parce-que myda est >>local donc on doit faire : >> lea eax,myda >> push eax >
Absolument, vrai. OFFSET s'applique seulement aux variables globals, vu qu'il utilise le debut du segment data comme point de repere. En meme temps les variables local sont sur le stack et on n'a aucun moyen de calculer leur address reel dans la memoire. LEA est la bonne instruction ici. Btw, ct ca la raison pour laquelle j'ai demande comment ils sont declares tes donnes.;oP
> Bonjour, je connais un peu l'ASM et je pense que dans ton cas >>(Arnotic), Bonjour, Tu connais pas si peu d'asm. J'ai vu des "grands specs" qui ignorent des details de ce genre;oP -- Filter
|
|
jeudi 13 mars 2003 à 19:45:53 |
Re : Fonction DLL avec arguments

Arnotic
|
ok, j'ai mis ca sa plante plus sauf que les paramèetre ne sont pas transmi mov eax, "test" mov bx, 4 push eax push bx call lpWriteData ?
------------------------------------------ Arnotic Mail : info@mistersp.com
------------------------------- Réponse au message : -------------------------------
> >>on ne peut pas faire un push offset myda parce-que myda est > >>local donc on doit faire : > >> lea eax,myda > >> push eax > > > > Absolument, vrai. OFFSET s'applique seulement aux variables globals, vu qu'il utilise le debut du segment data comme point de repere. En meme temps les variables local sont sur le stack et on n'a aucun moyen de calculer leur address reel dans la memoire. LEA est la bonne instruction ici. Btw, ct ca la raison pour laquelle j'ai demande comment ils sont declares tes donnes.;oP > > > Bonjour, je connais un peu l'ASM et je pense que dans ton cas > >>(Arnotic), > Bonjour, > Tu connais pas si peu d'asm. J'ai vu des "grands specs" qui ignorent des details de ce genre;oP > -- > Filter > >
|
|
jeudi 13 mars 2003 à 21:17:38 |
Re : Fonction DLL avec arguments

littlefl
|
> ok, > j'ai mis ca sa plante plus sauf que les paramèetre ne sont pas transmi > mov eax, "test" > mov bx, 4 > push eax > push bx > call lpWriteData
Arf, alors déjà ce n'est pas MOV mais LEA. Bon après voici la liste des choses que je pense ne pas être bonnes (corrige moi Filter si je me trompe ;p) : - MOV BX, 4 est inutile, il vaut mieux écrire PUSH 4 - En ASM 80x86, tous les types supérieurs au BYTE sont stockés de manière inversée en mémoire, donc faire MOV DWORD PTR [<var>],"<str>" est une mauvaise solution car 1. ça n'inclue pas le zéro terminal pour une SZ (ce qui n'ets aps le acs ici mais autant le rappeler ;) et 2. ça va le stocker à l'envers (enfin je crois). - En général, les chaînes se déclarent globales. - Met l'opérateur d'indexage, c'est bcp plus lisible ! Et comme ça des programmeur NASM pourront te venir en aide car sous NASM, l'assembleur exige la présence des []. - Met l'opérateur de taille (enfin je connais aps son nom, si qqun sait ?) je veux dire <size> PTR comme DWORD PTR ou BYTE PTR. C'est également plus lisible et là aussi les utilisateurs de NASM pourront te lire ^^. - Evite les registres 16 bits qd ton code est en 32 bits car même si tu gagnes 1 word dans une instruction comme MOV <reg16>, <imm16> tu les perds avec des instructions comme PUSH BX (1 byte de perdu puisque génération du préfixe de changement de taille d'opérande).
Bon, voilà un exemple non testé d'un code qui appel une fonction C (la syntaxe C ets celle de BC++/VC++ et la syntaxe ASM est celle de MASM.
/* test.c */
__declspec( dllexport ) void print( char *_string, unsigned _length ) { /* implémentation */ }
; test.asm
.data _string db "test"
_print$ = -4 test proc near
; chargement de la DLL, je ne vasi aps détailler, tu sais faire
; _print$ est le pointeur sur la fonction push 4 push offset _string call near ptr _print$[ebp] add esp, 8
Filter : Je ne sais pas qui sont tes grands specialistes mais ils sont quelque peu newbie si je puis me permettre ;p. Enfin, disons que cela relève plus de la connaissance de MASM que de la connaissance de l'ASM. Comme quoi, il vaut mieux ne pas abuser de la syntaxe "simpliste" (simplifiée diront certains ;) de MASM sous peine de ne plus savoir ce que l'on fait ^^.
------------------------------- Réponse au message : -------------------------------
> > ok, > j'ai mis ca sa plante plus sauf que les paramèetre ne sont pas transmi > mov eax, "test" > mov bx, 4 > push eax > push bx > call lpWriteData > ? > > ------------------------------------------ > Arnotic > Mail : info@mistersp.com > > > ------------------------------- > Réponse au message : > ------------------------------- > > > >>on ne peut pas faire un push offset myda parce-que myda est > > >>local donc on doit faire : > > >> lea eax,myda > > >> push eax > > > > > > > Absolument, vrai. OFFSET s'applique seulement aux variables globals, vu qu'il utilise le debut du segment data comme point de repere. En meme temps les variables local sont sur le stack et on n'a aucun moyen de calculer leur address reel dans la memoire. LEA est la bonne instruction ici. Btw, ct ca la raison pour laquelle j'ai demande comment ils sont declares tes donnes.;oP > > > > > Bonjour, je connais un peu l'ASM et je pense que dans ton cas > > >>(Arnotic), > > Bonjour, > > Tu connais pas si peu d'asm. J'ai vu des "grands specs" qui ignorent des details de ce genre;oP > > -- > > Filter > > > > >
|
|
jeudi 13 mars 2003 à 21:57:48 |
Re : Fonction DLL avec arguments

Arnotic
|
merci pour toutes ses explications mais malheureusement lorsque je lance le programme j'ai un msg de windows me disant que le prog est planté :/
arf, je comprend vraiment, surtout que les fonctions paramètre ca passe niquel :/ ------------------------------------------ Arnotic Mail : info@mistersp.com
------------------------------- Réponse au message : -------------------------------
> > > ok, > > j'ai mis ca sa plante plus sauf que les paramèetre ne sont pas transmi > > mov eax, "test" > > mov bx, 4 > > push eax > > push bx > > call lpWriteData > > Arf, alors déjà ce n'est pas MOV mais LEA. Bon après voici la liste des choses que je pense ne pas être bonnes (corrige moi Filter si je me trompe ;p) : > - MOV BX, 4 est inutile, il vaut mieux écrire PUSH 4 > - En ASM 80x86, tous les types supérieurs au BYTE sont stockés de manière inversée en mémoire, donc faire MOV DWORD PTR [<var>],"<str>" est une mauvaise solution car 1. ça n'inclue pas le zéro terminal pour une SZ (ce qui n'ets aps le acs ici mais autant le rappeler ;) et 2. ça va le stocker à l'envers (enfin je crois). > - En général, les chaînes se déclarent globales. > - Met l'opérateur d'indexage, c'est bcp plus lisible ! Et comme ça des programmeur NASM pourront te venir en aide car sous NASM, l'assembleur exige la présence des []. > - Met l'opérateur de taille (enfin je connais aps son nom, si qqun sait ?) je veux dire <size> PTR comme DWORD PTR ou BYTE PTR. C'est également plus lisible et là aussi les utilisateurs de NASM pourront te lire ^^. > - Evite les registres 16 bits qd ton code est en 32 bits car même si tu gagnes 1 word dans une instruction comme > MOV <reg16>, <imm16> tu les perds avec des instructions comme PUSH BX (1 byte de perdu puisque génération du préfixe de changement de taille d'opérande). > > Bon, voilà un exemple non testé d'un code qui appel une fonction C (la syntaxe C ets celle de BC++/VC++ et la syntaxe ASM est celle de MASM. > > /* test.c */ > > __declspec( dllexport ) void print( char *_string, unsigned _length ) { > /* implémentation */ > } > > ; test.asm > > .data > _string db "test" > > _print$ = -4 > test proc near > > ; chargement de la DLL, je ne vasi aps détailler, tu sais faire > > ; _print$ est le pointeur sur la fonction > push 4 > push offset _string > call near ptr _print$[ebp] > add esp, 8 > > Filter : Je ne sais pas qui sont tes grands specialistes mais ils sont quelque peu newbie si je puis me permettre ;p. > Enfin, disons que cela relève plus de la connaissance de MASM que de la connaissance de l'ASM. Comme quoi, il vaut mieux ne pas abuser de la syntaxe "simpliste" (simplifiée diront certains ;) de MASM sous peine de ne plus savoir ce que l'on fait ^^. > > ------------------------------- > Réponse au message : > ------------------------------- > > > > > ok, > > j'ai mis ca sa plante plus sauf que les paramèetre ne sont pas transmi > > mov eax, "test" > > mov bx, 4 > > push eax > > push bx > > call lpWriteData > > ? > > > > ------------------------------------------ > > Arnotic > > Mail : info@mistersp.com > > > > > > ------------------------------- > > Réponse au message : > > ------------------------------- > > > > > >>on ne peut pas faire un push offset myda parce-que myda est > > > >>local donc on doit faire : > > > >> lea eax,myda > > > >> push eax > > > > > > > > > > Absolument, vrai. OFFSET s'applique seulement aux variables globals, vu qu'il utilise le debut du segment data comme point de repere. En meme temps les variables local sont sur le stack et on n'a aucun moyen de calculer leur address reel dans la memoire. LEA est la bonne instruction ici. Btw, ct ca la raison pour laquelle j'ai demande comment ils sont declares tes donnes.;oP > > > > > > > Bonjour, je connais un peu l'ASM et je pense que dans ton cas > > > >>(Arnotic), > > > Bonjour, > > > Tu connais pas si peu d'asm. J'ai vu des "grands specs" qui ignorent des details de ce genre;oP > > > -- > > > Filter > > > > > > > > >
|
|
jeudi 13 mars 2003 à 22:02:06 |
Re : Fonction DLL avec arguments

filter
|
> - MOV BX, 4 est inutile, il vaut mieux écrire PUSH 4 Je n'utilise pas MASM et je ne suis pas tres sur mais en gas on fais pushl, et si je me trompe pas l'instruction correspondant en MASM c pushd, alors au lieu de: push 4 je ferrais pushd 4 Meme, si en mode 32 bits, la valeur sur le stack est DWORD par defaut.
> - En général, les chaînes se déclarent globales. On peut meme dire. TOUJOURS les chaines se declarent globales;o)
> - Evite les registres 16 bits qd ton code est en 32 bits car même si tu gagnes 1 word dans une instruction comme > MOV <reg16>, <imm16> tu les perds avec des instructions comme PUSH BX (1 byte de perdu puisque génération du préfixe de changement de taille d'opérande).
En plus, tt instruction 16 bit et plus lent a cause des penalties....
Arnotic, declare ton string LOCAL aSt[5]:BYTE mets dedans 4 't''s avec un "dec ecx jnz" Ajoute le 0 de la fin. (Tu devra utiliser, byte ptr 0). En gros fait ton code du genre: lea eax, aStr mov ecx,4 FILLSTRING: mov [eax], byte ptr 't' inc eax loop FILLSTRING (ou dec + jnz ou n'importe koi.) mov [eax], byte ptr 0 lea eax,aStr pushd 24 pushd eax call blablabla Ouufff, j'en ai marre..... a plus si t'as tjs des problemes..... -- Filter PS: Vive le syntax GAS!!!!!!!;oP
|
|
jeudi 13 mars 2003 à 22:57:02 |
Re : Fonction DLL avec arguments

littlefl
|
-- avant tout, désolé pour l'orthographe et la grammaire déplorable de ce post car je suis légèrement endormi ;p --
Urg, là je ne sais pas trop... si ça concerne les paramètres, vérifie que tu ne te trompes pas de convention d'appel (c'est stupide mais ça arrive ;). Pour rappel ,pour ceux qui ne le sauraient pas : Les conventions (à l'appel) : C : on passe les arguments à l'envers et on clean the stack STDCALL : on passe les arguments à l'envers et on ne clean pas le stack SYSCALL : pareil que STDCALL PASCAL : on passe les args à l'endroit et on ne clean pas le stack THISCALL (VC++ only) : alors là, this se passe dans ECX et les autres arguments de droite à gauche et on ne clean pas le stack sauf si c une fonction a VARARG (quoique ds le cas où la fonction prend des args variables je ne sais plus, faudrait vérifier...) FASTCALL (VC++) : on passe les deux premiers args ds ECX et EDX et le reste à la manière d'un STDCALL et on ne clean pas le stack FASTCALL (BC++) : pareil que le FASTCALL de MS sauf que là on utilise EAX pour passer le premier argument, ECX le 2sd et EDX le troisième
Bon ce sont les principaux qd on programme en C/ASM (je ne connais que ces deux langages, enfin 3 avec le C++).
Voilà, donc si tu appelles une fonction C faudra aps oublier de nettoyer la pile, et si tu appelles une fonction STDCALL faudra surtt pas le nettoyer. Sinon, je ne vois vraiment pas, je n'ai aps pour habitude d'utiliser les DLLs en linkage dynamique donc Filter, je te laisse la parole, mon ptit niveau d'ASM s'arrête là ;).
Sinon, fais nous voir ta source en entier, ptet qu'on en saura plus. (je dis ça mais ça serait plutôt ptet que Filter en saura plus pk moi je crois que là... ;pp).
Dis, Filter, c'est quoi GAS ? Moi je connais que, et ce exclusivement sous win32, MASM, NASM, FASM, SPASM et la syntaxe K&R pour l'inclusion dans du C... Et personnellement je ne prog qu'avec MASM, NASM et avec du C + ASM inline. Même si la dernière fois que j'ai touché de l'ASM pur remonte à qq temps ;). Sinon, sous MASM je crois que PUSHD existe mais ce n'est pas une instruction du proc donc vaut mieux aps l'utiliser, il vaut mieux faire PUSH DWORD PTR qui lui est une instruction du proc avec un opérande DWORD. Pour les strings, sauf s'il veut faire MOV pour chaque lettre ;p.
Après, pour ton code, euh, je pense qu'il est préférable de mettre un saut conditionnel et pas un LOOP car c'ets plus rapide m'enfin c'est comme on le sent ;). Pourquoi tu PUSH 24 ?? o.O la taille de la chaîne n'est-elle pas de 4 ? Et pour finir, au lieu de faire deux fois LEA pour charger l'adresse, tu devrais dès le début, PUSH sur la pile, les arguments (y compris EAX donc un LEA de moins) et après tu remplies la chaîne, comme FILLSTRING ne modifie pas la pile les args restent ;).
Bon, chui fatigué lol. @+ littlefl
|
|
Cette discussion est classée dans : fonction, dll, mov, arguments, myda
Répondre à ce message
Sujets en rapport avec ce message
Probleme de dll! (arguments...) [ par BlackWizzard ]
salut les pro!voila, G une fonction contenu dans une dll mais cette fonction, je ne sait pas comment lui ajouter des arguments...voici un extrait du c
Arguments d une fonction dans une DLL [ par MOUSSAOUIAAZIZ ]
Salut;J'aimerais savoir si il est possible de trouver la liste d'arguments variables d'une fonction dans une bibliothèque de liens dynamiques (DL
[URGENT] Passer des arguments a une DLL [ par BlackWizzard ]
Bonjours, je voudrai creer un dll en asm (ce qui est fait) mais je n'arrive pas a passer des arguments a la seul fonction de cette dll.imaginons le co
pb affichage console [ par mat74 ]
voila je cherche a faire un prog qui affiche 0 ou 1 en fonction de la valeur de ax . et le teste est ds une procedure . mais il y a un pb le prog n'af
Aidez moi à traduire une petite fonction assembleur en C (API Windows) [ par skirby ]
Bonjour à tous, J'essaye désespérément de traduire une fonction ASM en C. Le but de cette fonction est de pouvoir utiliser une ressource compilé dans
pb mov [di+si], [bx+si] [ par nicographx ]
bonjourj'ai un problème : je cherche à faire une instruction de typemov [di+si], [bx+si]mais je ne voit pas comment faire, il me ressort toujours la m
MOV CX,ES:[DI] ??? [ par Arnaud16022 ]
hello tout le monde question de newbie, je comprends pas cette command: MOV CX,ES:[DI] bon le mve ca va, le CX itou, mais apres ca coince... plus géné
interruptions [ par junior300 ]
bonjour, en récupérant un bout de code d'une source découverte sur ce siteg creer cette fonction!!celle ci ne fonctionne pas lorsque j'essaye de passe
Parcour et trie d'un tableau [ par SalAdiN23 ]
salut à tt.bon voila c pr trié un tableau d'entiees en ordre croissent.et avré dire je cpas tropcomment parcourir un tableau en assembleur.en pascal p
Création d'une dll sous Win [ par JoTheDoor ]
Bonjour,Malgré tout les indications de Winamp, je me suis entêté à créer un plugin avec RadAsm. Tout fonctionne très bien sous Win 95/98. Mais sous
Livres en rapport
|
Derniers Blogs
MIX10 A LAS VEGAS : IMMERSIONMIX10 A LAS VEGAS : IMMERSION par odewit
Hi from Vegas !
En resume [je corrigerai les accents a mon retour !], Las Vegas m'impressionne par sa demesure.
Ou que l'on aille, les itineraires traversent des salles bruyantes pleines de machines a sous et de tables de jeu.
Les decors, surtout a...
Cliquez pour lire la suite de l'article par odewit [RIA SERVICES] MAITRE - DéTAIL ET DOMAINDATASOURCE[RIA SERVICES] MAITRE - DéTAIL ET DOMAINDATASOURCE par Audrey
A l'occasion d'un projet client, j'ai utilisé RIA Services avec Silverlight 3 (mais cela fonctionne aussi avec la version 4), et je l'ai utilisé pour une interface façon Maitre / Détail. Voici comment j'ai procédé pour arriver à mes fins. Nous allons pren...
Cliquez pour lire la suite de l'article par Audrey CSDL FUNCTIONCSDL FUNCTION par Matthieu MEZIL
Dans mon post précédent , j'ai utilisé une CSDL Function afin de générer une requête SQL avec un DateDiff utilisant la date courante sur la BD à partir d'une requête LINQ. Dans le cadre de ce post , vous avez probablement remarqué que dans le cadre de plu...
Cliquez pour lire la suite de l'article par Matthieu MEZIL LINQ TO ENTITIESLINQ TO ENTITIES par Matthieu MEZIL
Cette semaine je suis à Montréal en tant que speaker sur Entity Framework pour l'évènement confoo . J'en profite pour remercier les organisateurs de cet évènement de m'avoir fait confiance et Access-IT de m'avoir permis d'y participer. En parallèle, j'ai ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010 par neodante
La nouvelle interface d'Office 2010 à amener quelques modifications par rapport à celle de 2007. Certes mineures, ces modifications ont fait disparaître la case à cocher de l'onglet 'Développeur' en première page du panneau du 'bouton Office' (dans Office...
Cliquez pour lire la suite de l'article par neodante
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|