1

.dll ファイルをエクスポートしようとしており、C# アプリケーションでそれを使用してポートにデータを書き込もうとしています。.cpp ファイル (.dll を作成するため) で「out」コマンドを使用すると、「エラー C2415: 不適切なオペランド タイプ」というエラー メッセージが表示されます。この「out」コマンドを使用できない理由がわかりましたか? (「mov」コマンドはうまく機能しています)

以下の私のコードを参照してください:

#include <stdio.h>

extern "C" __declspec(dllexport) void enableWatchDog()
    _asm {
          out 66,41
          out 62,4
    }
}
4

3 に答える 3

5

out次の 6 つの形式があります。

  • out imm8, AL
  • out imm8, AX
  • out imm8, EAX
  • out DX, AL
  • out DX, AX
  • out DX, EAX

あなたの使用法はそれらのどれとも一致しません。おそらくこれはうまくいくでしょう(テストされていません):

mov al, 41
out 66, al
mov al, 4
out 62, al

x86 の IO ポートの経験はあまりありませんが、私が見つけたものから、66 と 62 は少し疑わしいようです。それらは66hと62hであるべきではありませんか?41h (2 つのフラグ セット、または ASCII 'A' の可能性があります) も、41 (かなり恣意的な数値) よりも少し理にかなっています。

于 2012-08-06T15:06:12.990 に答える
1

アセンブリは、任意の式をどこにでも差し込める高級言語ではありません。このoutコマンドはAx、2 番目のオペランドにのみレジスタを使用できます。ここで、Ax は AL、AX、または EAX を意味します。したがって、次のように再定式化します。

mov al, 41
out 66, al
mov al, 4
out 62, al

outコマンドには特権があります。Windows のカーネル レベル ドライバーでのみ機能します。通常のプログラムで実行しようとすると、「無効な操作」エラーが発生します。

于 2012-08-06T15:08:36.857 に答える
0

C ++ dllに使用しているターゲットプラットフォームは何ですか?CLRではなくx86コードにコンパイルする必要があります。

于 2012-08-06T15:04:09.323 に答える