1

MASM32アセンブリで課題を書いていますが、ほぼ完了しましたが、答えられない質問が2つあります。まず、コンパイルすると次のメッセージが表示されます。

INVOKEには手順のプロトタイプが必要です

無効な命令オペランド

1つ目は、このコードによるものです。

.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]

私はそれを機能させるために何を書くべきかを正確に理解しておらず、2番目のエラーの原因や修正方法さえも知りません... = /


編集

私はすでにそれらのライブラリを持っており、これらも次のとおりです。

.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の前とライブラリの後に配置しました)。

4

1 に答える 1

2

外部APIを呼び出すには、適切な*.incファイルとそれぞれの*.libファイルを含める必要があります。
これらのステートメントをリストに追加してみてください。

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

(\ masm32がmasm32ディレクトリを参照していると仮定します)

更新:
プロトタイプ定義は基本的に、それぞれの関数がスタック上で期待するパラメーターの数をアセンブラーに通知します。あなたの場合、APIは1つの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に結果が含まれるようになりました。

于 2009-02-09T01:21:40.563 に答える