Syntax 装配原型指令

Syntax 装配原型指令,syntax,assembly,masm,Syntax,Assembly,Masm,我正在MASM32汇编中写作业,我几乎完成了,但我有两个问题似乎无法回答。首先,当我编译时,我得到了以下信息: 调用需要的原型 程序 & 无效的指令操作数 第一个原因是这段代码: .data? Freq DWORD ? Time1 DWORD ? Time2 DWORD ? .code start: invoke QueryPerformanceFrequency, addr Freq invoke QueryPerformanceCounter, addr Time1 现在

我正在MASM32汇编中写作业,我几乎完成了,但我有两个问题似乎无法回答。首先,当我编译时,我得到了以下信息:

调用需要的原型 程序

&

无效的指令操作数

第一个原因是这段代码:

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

.code
start:
invoke QueryPerformanceFrequency, addr Freq
invoke QueryPerformanceCounter, addr Time1 
现在,我知道了

INVOKE指令必须在前面 通过过程的PROTO语句 被召唤

但即使我找到了PROTO语句的语法:

label PROTO [distance] [langtype] [,[parameter]:tag]
我不太明白我应该写些什么来让它工作,我甚至不知道是什么导致了第二个错误或者如何修复它=/


编辑

我已经有了这些库,这些库还包括:

.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
我在WindowsVista下工作,以防万一这也有帮助


编辑2

如果在.data之后写入Freq:QWORD,则会收到以下错误消息:

寄存器的使用假定为错误

还有,我应该在哪里添加

QueryPerformanceCounter PROTO :DWORD

据我所知,它没有出错,但我仍然不确定是否更改了任何内容(我将它放在了.data之前和之后)。

为了调用外部API,您需要包含相应的*.inc文件以及相应的*.lib文件。
尝试将以下语句添加到列表中:

include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
(假设\masm32引用您的masm32目录)

更新:
原型定义基本上告诉汇编程序相应函数在堆栈上需要多少参数。在您的例子中,API希望堆栈上有一个32位参数,原型反映了这一点,如下所示:

QueryPerformanceCounter PROTO :DWORD
更新2:
为了使用性能计数器API,您需要一个四字。原因是,API需要一个指向四字(64位)的指针作为参数(因此原型中的DWORD):

这应该能奏效

更新3:
这里有一个完整的例子对我很有用:

    .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 
我想就是这样:)
ESI和EDI现在包含结果。

是否在.data之后?或者,很抱歉,我以前没有使用任何“QueryPerformanceCounter”。在我的示例中,Freq是一个局部变量,即驻留在函数中的变量。但是您也可以在数据部分定义它,如果包含kernel32.inc,那么QueryPerformance*API就不需要原型。试试我发布的最后一个例子。
    .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