IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[MASM32] Comment utiliser la fonction printf


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Par défaut
    Bonjour Neitsa
    Chez moi ton code ne fonctionne pas, en effet lors du call printf (call visible une fois le programme désassemblé, l'équivalent de ce call est la ligne "invoke crt_printf") rien ne s'affiche et je reçois un jolie ERROR_INVALID_HANDLE.

    Pourrais tu me dire en quoi, et pourquoi, l'appel à cette fonction, qui semble fonctionner correctement chez toi, ne tourne pas chez moi ?



    Amicalement, Squallsurf

  2. #22
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Salut Squall

    Citation Envoyé par Squallsurf
    Bonjour Neitsa
    Chez moi ton code ne fonctionne pas, en effet lors du call printf (call visible une fois le programme désassemblé, l'équivalent de ce call est la ligne "invoke crt_printf") rien ne s'affiche et je reçois un jolie ERROR_INVALID_HANDLE.

    Pourrais tu me dire en quoi, et pourquoi, l'appel à cette fonction, qui semble fonctionner correctement chez toi, ne tourne pas chez moi ?

    Amicalement, Squallsurf
    Bizarre en effet...

    - Tu as essayé de mettre un "invoke SetLastError,0" au début du code pour voir si ça vient vraiment de printf ?

    (je sais que sous Olly j'ai ERROR_INVALID_HANDLE avant d'exécuter quoi que ce soit à l'OEP). Si tu as l'erreur en step over sur le call printf, ça vient bien de printf...

    - Question bête : tu compiles bien en passant /SUBSYSTEM:CONSOLE au linker ?

    Sinon je ne vois vraiment pas, d'autant plus que le code est riquiqui et fonctionne bien chez moi... (compilé, testé et débuggué sous Win XP SP2).

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Par défaut
    Citation Envoyé par Neitsa
    - Question bête : tu compiles bien en passant /SUBSYSTEM:CONSOLE au linker ?
    Question bête pour un bidouilleur bête
    En effet je ne passais pas cet argument au linker...
    Merci bien, ca fonctionne correctement maintenant



    Amicalement, Squallsurf

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    Moi aussi j'ai essayé ce programme, et il marche sans soucis mais.... j'ai du changer "ret" en "ExitProcess, 0" parce que sinon il compile mais le programme provoque une erreur à la fin de l'execution

    C'est normal?

    Pour info, j'ai compilé comme ça :
    ml -c -coff -IC:\masm32\include hello.asm
    link -subsystem:console -libpath:C:\masm32\lib hello

  5. #25
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Citation Envoyé par _Michel
    Moi aussi j'ai essayé ce programme, et il marche sans soucis mais.... j'ai du changer "ret" en "ExitProcess, 0" parce que sinon il compile mais le programme provoque une erreur à la fin de l'execution

    C'est normal?

    Pour info, j'ai compilé comme ça :
    ml -c -coff -IC:\masm32\include hello.asm
    link -subsystem:console -libpath:C:\masm32\lib hello
    Oops... C'est normal, il y a un PUSH qui n'est pas "popé". Il faut mettre un pop après la fin de la boucle et ça devrait fonctionner sans soucis (ou alors mettre le PUSH ECX sous le JZ mais toujours avant le "invoke" : pas besoin de pop après la boucle dans ce cas là).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [...]
    	pop ecx
    	jmp @HelloLoop
    @EndLoop:
    	pop ecx
     
    	ret
    end start

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    Ca marche au poil !

    Merci beaucoup pour votre aide

  7. #27
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Ce qui compte du côté de MASM c'est de ne pas créer de point d'entrée et de respecter la convention du compilateur. Cet exemple-là marche avec MinGW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    .386
    .model flat
     
    extern _puts:proc
     
    .data
    chaine  byte  "Salut tout le monde !", 0
     
    .code
    _func proc
            push offset chaine
            call _puts
            add esp, 4
            ret
    _func endp
     
    END
    Tu peux aussi utiliser .model flat, c ou prototyper _puts comme fonction C pour pouvoir utiliser invoke.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Excel] Comment utiliser la fonction RECHERCHEV
    Par forsay1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 03/02/2006, 11h43
  2. Réponses: 3
    Dernier message: 31/12/2005, 23h09
  3. Comment utiliser la fonction NBR.JOURS.OUVRES?
    Par MEHCOOPER dans le forum Access
    Réponses: 9
    Dernier message: 20/10/2005, 12h50
  4. [MASM32] Comment utiliser md5()
    Par sefo dans le forum x86 32-bits / 64-bits
    Réponses: 14
    Dernier message: 13/12/2004, 00h29
  5. Réponses: 11
    Dernier message: 22/12/2003, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo