2012-08-06 260 views
1

我想導出一個.dll文件並試圖在我的c#應用程序中使用它來將數據寫入端口。在我的.cpp文件(用於創建.dll)中,如果使用「out」命令,它會給出「錯誤C2415:不正確的操作數類型」錯誤消息。你知道爲什麼我不能使用這個「out」命令嗎? ( 「MOV」 命令運作良好的BTW)內聯彙編,out指令

見下面我的代碼:

#include <stdio.h> 

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

什麼是平臺?視窗?如果是這樣,你在寫驅動程序嗎?如果不是的話,'out'永遠不會工作,你的程序只會強制關閉。 – 2012-08-06 15:31:33

+0

如果您嘗試在Windows下創建計時器,請查看[如何在WinApi中創建計時器](http://stackoverflow.com/questions/2128620/how-to-create-timer-in-winapi-c) – 2012-08-06 15:48:52

回答

5

out有六種形式:

  • 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(可以是兩個標誌設置,或ASCII'A')對我來說也比41(一個相當任意的數字)更有意義。

+0

謝謝你解決了我的問題。 – 2012-08-07 06:16:27

0

什麼目標平臺是您使用您的C++的dll?您需要編譯爲x86代碼,而不是CLR。

+0

錯誤「錯誤C2415:不正確的操作數類型」顯然是關於out指令,而不是CLR與本地代碼。 – 2012-08-06 17:32:37

1

程序集不是高級語言,您可以在任何地方插入任意表達式。 out命令只能將Ax寄存器作爲第二個操作數,其中Ax表示AL,AX或EAX。因此如此配製:

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

out命令有特權;它只適用於Windows上的內核級驅動程序,試圖在常規程序中執行它會導致「無效操作」錯誤。