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有六种形式:

  • 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(一个相当随意的数字)更有意义。

于 2012-08-06T15:06:12.990 回答
1

汇编不是一种高级语言,您可以在其中插入任意表达式。该out命令只能将Ax寄存器用于第二个操作数,其中 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 使用的目标平台是什么?您需要编译为 x86 代码,而不是 CLR。

于 2012-08-06T15:04:09.323 回答