组装原型说明
Posted
技术标签:
【中文标题】组装原型说明【英文标题】:Assembly Prototype instruction 【发布时间】:2009-02-09 01:13:29 【问题描述】:我正在写一个 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 之前和库之后)。
【问题讨论】:
如果包含 kernel32.inc,则不需要 QueryPerformance* API 的原型。试试我发布的最后一个例子。 【参考方案1】:为了调用外部 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
这应该可以解决问题。
更新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 是一个局部变量,即驻留在函数中的变量。但是你也可以让它在数据部分中定义。以上是关于组装原型说明的主要内容,如果未能解决你的问题,请参考以下文章