组装原型说明

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 是一个局部变量,即驻留在函数中的变量。但是你也可以让它在数据部分中定义。

以上是关于组装原型说明的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要进出组装说明? [关闭]

对组装说明感到困惑

ORG 组装说明有啥作用?

CUDA 组装说明

原型设计 + 用户规格说明书

04个人作业:电梯演讲2.0:原型展示说明