1

我在 MASM32 Assembly 中写了一个作业,我几乎完成了它,但我有 2 个问题我似乎无法回答。首先,当我编译时,我收到消息:

INVOKE 需要程序原型

&

无效的指令操作数

首先是由于这段代码:

.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

我在 Windows Vista 下工作,以防万一也有帮助。


编辑 2

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

使用假定为 ERROR 的寄存器

还有我应该在哪里添加

QueryPerformanceCounter PROTO :DWORD

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

4

1 回答 1

2

为了调用外部 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):

LOCAL Freq  :QWORD
invoke QueryPerformanceFrequency, ADDR Freq

这应该可以解决问题。

Update3:
所以这是一个对我有用的完整示例:

    .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 现在包含结果。

于 2009-02-09T01:21:40.563 回答