Anweisung des Montageprototyps
Frage
Ich schreibe eine Aufgabe in der Masm32 -Versammlung und habe sie fast abgeschlossen, aber ich habe 2 Fragen, die ich nicht beantworten kann. Erstens, wenn ich zusammenstelle, bekomme ich die Nachricht:
Aufrufen erfordert Prototyp für den Verfahren
&
Ungültige Anweisungsoperanden
Der erste ist auf dieses Stück Code zurückzuführen:
.data?
Freq DWORD ?
Time1 DWORD ?
Time2 DWORD ?
.code
start:
invoke QueryPerformanceFrequency, addr Freq
invoke QueryPerformanceCounter, addr Time1
Jetzt weiß ich das
Der Aufrufanweisung muss eine Protoanweisung für das aufgerufene Verfahren vorausgehen.
Aber obwohl ich die Syntax für die Proto -Anweisung herausgefunden habe:
label PROTO [distance] [langtype] [,[parameter]:tag]
Ich verstehe nicht genau, was ich schreiben sollte, um es zum Laufen zu bringen, und ich weiß nicht einmal, was den zweiten Fehler verursacht oder wie es behoben werden soll ... =/
Bearbeiten
Ich habe bereits diese Bibliotheken und diese auch:
.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
Ich arbeite unter Windows Vista, nur für den Fall, dass dies auch hilft.
Bearbeiten 2
Wenn ich nach der .data das Freq: qWord schreibe, erhalte ich diese Fehlermeldung:
Die Verwendung des Registers wird fehlerhaft angenommen
und auch wo soll ich das hinzufügen
QueryPerformanceCounter PROTO :DWORD
Was ich weiß, machte kein Fehler, aber ich bin mir immer noch nicht sicher, ob ich etwas geändert habe (ich habe es vor .data und nach den Bibliotheken platziert).
Lösung
Um eine externe API aufzurufen, müssen Sie sowohl die entsprechende *.inc -Datei als auch die jeweilige *.lib -Datei einfügen.
Versuchen Sie, diese Aussagen zu Ihrer Auflistung hinzuzufügen:
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
(Angenommen, masm32 bezieht sich auf Ihre Masm32 -Dir))
Aktualisieren:
Die Prototypdefinition zeigt dem Assembler im Grunde genommen an, wie viele Parameter die jeweilige Funktion auf dem Stapel erwartet. In Ihrem Fall erwartet die API, dass sich ein 32 -Bit -Parameter auf dem Stapel befindet, was sich im solchen Prototyp widerspiegelt:
QueryPerformanceCounter PROTO :DWORD
Update2:
Um die Performance Counter -API zu verwenden, benötigen Sie ein Quadwort. Der Grund ist, dass die API einen Zeiger auf ein Quadwort (64 Bit) als Parameter erwartet (daher das DWORD im Prototyp):
LOCAL Freq :QWORD
invoke QueryPerformanceFrequency, ADDR Freq
Dies sollte den Trick machen.
Update3:
Hier ist ein komplettes Beispiel, das für mich funktioniert:
.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
Ich denke, das ist es :) ESI und EDI enthalten jetzt das Ergebnis.