2009-02-09 34 views
1

我正在寫MASM32程序集中的任務,我幾乎完成了它,但我有兩個問題,我似乎無法回答。首先,我編譯時得到消息:組裝原型指令

INVOKE需要原型 程序

&

無效的指令操作數

首先是由於這一段代碼:

.data? 
Freq DWORD ? 
Time1 DWORD ? 
Time2 DWORD ? 

.code 
start: 
invoke QueryPerformanceFrequency, addr Freq 
invoke QueryPerformanceCounter, addr Time1 

現在,我知道

的調用指令必須由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

如果我寫的頻率:對。數據我收到此錯誤消息後QWORD:

使用寄存器的假設ERROR

以及我應該在哪裏添加

QueryPerformanceCounter PROTO :DWORD 

據我所知,雖然沒有發生錯誤,但我仍然不確定是否改變了任何內容(我將它放在.data之前和庫之後)。

+0

如果包含kernel32.inc,則不需要QueryPerformance * API的原型。嘗試我發佈的最後一個例子。 .data之後是 – newgre 2009-02-09 02:20:24

回答

2

爲了調用外部API,您需要包含相應的* .inc文件以及相應的* .lib文件。
嘗試將這些語句添加到您的房源:

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

(假設\ MASM32 referes您MASM32 DIR)

更新:
原型定義主要是告訴彙編多少個參數,各函數期望在堆棧上。在你的情況下,API預計一個32位的參數是堆棧,它由原型是這樣反映:

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現在包含的結果。

+0

?或者我很抱歉,我以前沒有使用任何「QueryPerformanceCounter」。在我的例子中, – Tsundoku 2009-02-09 01:30:56