2012-08-06 259 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上的内核级驱动程序,试图在常规程序中执行它会导致“无效操作”错误。