2009-02-09 13 views
1

Je suis en train d'écrire une affectation dans MASM32 Assembly et j'ai presque terminé, mais j'ai deux questions auxquelles je n'arrive pas à répondre. Tout d'abord, quand je compile je reçois le message:Instruction du prototype d'assemblage

INVOKE nécessite prototype procédure

&

opérandes d'instruction non valide

la première est due à cette pièce de code:

.data? 
Freq DWORD ? 
Time1 DWORD ? 
Time2 DWORD ? 

.code 
start: 
invoke QueryPerformanceFrequency, addr Freq 
invoke QueryPerformanceCounter, addr Time1 

maintenant, je sais que

La directive INVOKE doit être précédée par une instruction PROTO pour la procédure appelée.

, mais même si je trouve la syntaxe de l'instruction PROTO:

label PROTO [distance] [langtype] [,[parameter]:tag] 

Je ne comprends pas exactement ce que je devrais écrire pour le faire fonctionner et je ne sais même pas ce que est à l'origine de la deuxième erreur ou comment le réparer ... =/


Modifier

J'ai déjà ces bibliothèques et ces également:

.386 
.model flat, stdcall 
option casemap :none 

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 

Je travaille sous Windows Vista juste au cas qui aide aussi bien.


Edit 2

Si j'écris Freq: QWORD après la .data je reçois ce message d'erreur:

utilisation du registre supposé ERREUR

et aussi où dois-je ajouter le

QueryPerformanceCounter PROTO :DWORD 

Qui, pour autant que je sache, n'a pas fait d'erreur mais je ne suis pas sûr de rien changer (je l'ai placé avant .data et après les bibliothèques).

+0

Si vous incluez kernel32.inc, vous n'avez pas besoin du prototype pour les API QueryPerformance *. Essayez le dernier exemple que j'ai posté. – newgre

Répondre

2

Pour appeler une API externe, vous devez inclure le fichier * .inc approprié ainsi que le fichier * .lib correspondant.
Essayez d'ajouter ces déclarations à votre annonce:

include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

(en supposant \ masm32 référés à votre masm32 dir)

Mise à jour:
La définition prototype indique essentiellement l'assembleur nombre de paramètres respectif fonction attend sur la pile. Dans votre cas, l'API attend un paramètre de 32 bits pour être sur la pile, ce qui se traduit par le prototype comme ceci:

Update2:
Pour utiliser le compteur de performance API vous avez besoin d'un quadword. La raison est que l'API attend un pointeur vers un quadword (64 bits) comme paramètre (donc le DWORD dans le prototype):

LOCAL Freq :QWORD 
invoke QueryPerformanceFrequency, ADDR Freq 

Cela devrait faire l'affaire.

Update3:
Alors, voici un exemple complet qui fonctionne pour moi:

.486 
    .model flat, stdcall 
    option casemap :none 

    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\masm32.inc 

    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\masm32.lib 

    doPerf  PROTO 

.code 

start: 

    invoke doPerf 
    invoke ExitProcess,eax 

    doPerf proc 

     LOCAL Freq :QWORD 
     invoke QueryPerformanceFrequency, ADDR Freq 
     mov esi, dword ptr Freq 
     mov edi, dword ptr Freq+4 

     ret 

    doPerf endp 

end start 

Je suppose que ce qu'il :) ESI et EDI contiennent maintenant le résultat.

+0

est-ce après le .data? ou là où je suis désolé je n'ai vraiment utilisé aucun "QueryPerformanceCounter" avant. – Tsundoku

+0

dans mon exemple Freq est une variable locale, c'est-à-dire une variable résidant dans une fonction. Mais vous pouvez tout aussi bien le définir dans la section des données. – newgre