我正在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之前和库之后)。
答案 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现在包含结果。