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 :

QueryPerformanceCounter


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut QueryPerformanceCounter
    Euh, je sait de manière certaine avoir un compteur de performance, mais QueryPerormanceFrequency me retourne false. C'est cencé vouloir dire que je n'en ai pas, mais d'après un programme n C++ que je code en quelques secondes, il existe bien et a une frequence de 3 Mghz.

    Pourquoi QueryPerformancecFrequency me retourne false ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    invoke QueryPerformanceFrequency, Addr FrequencecCompteur

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Par défaut
    et la déclaration de ta variable ? elle se présente comment ?

    j'ai fais un test en lui passant un dword pile poil, et voilà l'erreur que j'ai obtenu :



    c'est la même ?

    comme c'est dit dans la MSDN, il faut lui passer un pointeur sur un LARGE_INTEGER, bref un 64 bit. de cette manière ça marche chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    .data
      FrequenceCompteur dd 2 dup(0)
     
    .code
      ...
      invoke QueryPerformanceFrequency, OFFSET FrequenceCompteur
    A+

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    ca c'est bon, j'ai definis le Typepef LONG_INTEGER et il a une taille de 8 octets. Comment la fonction peut savoir qu'un mauvais argument est passé ??

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Par défaut
    la fonction ne teste pas vraiment l'argument, du moins je crois pas (puisque c'est une adresse mémoire). c'est plutôt pendant son déroulement, que si elle rencontre un problème, elle inscrit un code erreur dans une zone définie, permettant de savoir pourquoi l'api a planté.

    pour connaître ce code erreur, tu peux appeler l'api GetLastError, et rechercher l'erreur correspondante dans la tableau des codes erreurs ... mais avec olly c'est beaucoup plus simple

    c'est quoi l'erreur que l'api QueryPerformanceFrequency rencontre dans ton cas ?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    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
     
    LARGE_INTEGER			struct
    	LowPart		DWORD		?
    	HighPart	SDWORD		?
    LARGE_INTEGER			ends
     
    QueryPerformanceFrequency	PROTO lpFrequency:PTR LARGE_INTEGER
     
    ...
     
    FrequenceCompteur		LARGE_INTEGER	<0,0>
     
    ...
     
    invoke QueryPerformanceFrequency, ADDR FrequenceCompteur
    GetLastError retourne 998 :

    ERROR_NOACCESS
    Invalid access to memory location.


    J'ai reverifié, je vois pas ce qui pose problème dans la location de ma variable...

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Par défaut
    alors là je dois bien avouer que c'est assez déroutant ... et ahurissant !
    en effet, j'ai effectué plusieurs essais et aléatoirement parfois ça ne marchait pas.
    sauf qu'il n'y a pas de hasard en informatique lol, et voilà ce que j'ai trouvé :
    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
    18
    19
    20
    21
    22
    23
    24
    .386
    .model flat, stdcall
    option casemap : none
     
    include \masm32\include\windows.inc
     
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
     
    .data
      Vide db 11 dup(0FFh)
      FrequenceCompteur LARGE_INTEGER <0>
      TxtPasMarche db "Ça ne fonctionne pas", 0
     
    .code
      start:
        invoke QueryPerformanceFrequency, OFFSET FrequenceCompteur
        .IF !eax
          invoke MessageBox, NULL, OFFSET TxtPasMarche, NULL, MB_OK or MB_ICONERROR
        .ENDIF
        invoke ExitProcess, NULL
      end start
    si tu essaies ce code, tu devrais avoir une messagebox

    maintenant dans la ligne :
    Vide db 11 dup(0FFh)
    remplaces le 11 par 0, 4, 12, ... bref un nombre multiple de 4.
    compiles, exécutes ... et là pas de messagebox.

    bizarrement ça ne fonctionne que lorsque l'adresse de ta variable est :
    xxxxxx0
    xxxxxx4
    xxxxxx8
    xxxxxxC

    bref pour résoudre le problème mets la déclaration de ta variable en première position.

    PS : si une personne connaît les raisons de cette limitation, qu'il hésite pas à se manifester !

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Aaaahhh il faut aligner les données sur 4 octets !! ils auraient pu preciser dans le sdk quand même... Je vois pas du tout l'interet d'aligner là, mais effectivement si quelqu'un sait pourquoi, ca m'interesse aussi :))

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/07/2011, 15h58
  2. QueryPerformanceCounter : question existentielle :aie:
    Par Auteur dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 02/12/2009, 10h53

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