Syntax 装配原型指令
我正在MASM32汇编中写作业,我几乎完成了,但我有两个问题似乎无法回答。首先,当我编译时,我得到了以下信息: 调用需要的原型 程序 & 无效的指令操作数 第一个原因是这段代码:Syntax 装配原型指令,syntax,assembly,masm,Syntax,Assembly,Masm,我正在MASM32汇编中写作业,我几乎完成了,但我有两个问题似乎无法回答。首先,当我编译时,我得到了以下信息: 调用需要的原型 程序 & 无效的指令操作数 第一个原因是这段代码: .data? Freq DWORD ? Time1 DWORD ? Time2 DWORD ? .code start: invoke QueryPerformanceFrequency, addr Freq invoke QueryPerformanceCounter, addr Time1 现在
.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
我在WindowsVista下工作,以防万一这也有帮助
编辑2 如果在.data之后写入Freq:QWORD,则会收到以下错误消息: 寄存器的使用假定为错误 还有,我应该在哪里添加
QueryPerformanceCounter PROTO :DWORD
据我所知,它没有出错,但我仍然不确定是否更改了任何内容(我将它放在了.data之前和之后)。为了调用外部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): 这应该能奏效 更新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是一个局部变量,即驻留在函数中的变量。但是您也可以在数据部分定义它,如果包含kernel32.inc,那么QueryPerformance*API就不需要原型。试试我发布的最后一个例子。
.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