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).

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top