装配原型指令

时间:2009-02-09 01:13:29

标签: syntax assembly masm

我正在MASM32大会上写作,我几乎完成了它,但我有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之前和库之后)。

1 个答案:

答案 0 :(得分:2)

要调用外部API,您需要包含相应的* .inc文件以及相应的* .lib文件。
尝试将这些陈述添加到您的列表中:

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

(假设\ masm32参考你的masm32目录)

<强>更新
原型定义基本上告诉汇编器各个函数在堆栈上期望的参数数量。在您的情况下,API期望一个32位参数在堆栈上,这由原型反映如下:

QueryPerformanceCounter PROTO :DWORD

<强> UPDATE2:
要使用性能计数器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现在包含结果。