内联汇编,外出指令

时间:2012-08-06 14:58:12

标签: c++ assembly

我正在尝试导出.dll文件并尝试在我的c#应用程序中使用它来将数据写入端口。在我的.cpp文件中(创建.dll)如果我使用“out”命令,则会出现“错误C2415:不正确的操作数类型”错误消息。你知道为什么我不能使用这个“out”命令吗? (“mov”命令运行良好顺便说一句)

请参阅下面的代码:

#include <stdio.h>

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

3 个答案:

答案 0 :(得分: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(一个相当任意的数字)更有意义。

答案 1 :(得分:1)

程序集不是高级语言,您可以在任何地方插入任意表达式。 out命令只能将Ax寄存器用于第二个操作数,其中Ax表示AL,AX或EAX。所以重新制定如下:

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

out命令具有特权;它仅适用于Windows上的内核级驱动程序,尝试在常规程序中执行此操作将使您获得&#34;无效操作&#34;错误。

答案 2 :(得分:0)

您使用的C ++ dll目标平台是什么?您需要编译为x86代码,而不是CLR。