gomi所说似乎不行
out和in的汇编都不能执行。(NT)

解决方案 »

  1.   

    可以采用文件方式或直接端口访问(_inp,_oup;#include <conio.h>),文件方式在NT,9x,2000都可以使用,后一种只能在9x下使用。文件方式使用ReadFile(),WriteFile()操作
      

  2.   

    访问I/O的指令是特权指令,普通ring3的程序不能使用,只有使用vxd等办法切到ring0下才可以使用。但是如果是要使用某些特殊的端口,如串口,Windows本身提供了驱动,可以用CreateFile的方式打开。另外CMOS的70和71端口好象也可以使用,不过不太确定。不同的硬件有不同的驱动,不能单纯说有一个对I/O的vxd。你到是可以写个通用的切到ring0的vxd,在其中插入I/O指令。另外,在95/98下,写16位的程序也可以访问端口。那你就要用BC3.1或VC1.5什么的了
      

  3.   

    我用delphi的同学说delphi可以直接嵌汇编操作端口,
    你用delphi写个dll
      

  4.   

    可以使用tvichw32.dll来实现,他支持
      

  5.   

    sunhongbo 大虾:
    tvichw32.dll 只提供输出函数名,但不知道参数和功能,怎么办?
      

  6.   

    如果你需要的话,请发email:[email protected][email protected]
      

  7.   

    我刚才在我的机器里发现一个W32程序访问I/O多口的库,如果需要,庆贺我联系
    EMAIL:[email protected]
    [email protected]
      

  8.   

    #include <conio.h>   before use _inp(..), _outp(..),....
      

  9.   

    win95/98的程序是可以直接访问端口的,系统没有对此加以限制,关键是你自己要管理好。使用_inp、_outp函数当然要加#include <conio.h>。
    另外,DLL和VXD不是一回事。DLL与LIB相对,都包含一些库函数,只不过一个是动态(不连入你的应用程序),一个是静态(连入你的程序)。DLL和应用程序都运行于ring3层,即非特权层,而VXD运行于ring0层,即处于系统核心的特权层。对硬件的控制一般在ring0层进行,即需要特权,因为硬件总是(在特定时间)独占的,不允许应用程序直接控制,否则易引起冲突。但win9x没有对端口进行特权管理,即应用程序可以直接控制。为了防止冲突,也可以写一个VXD对端口控制,应用程序通过VXD间接使用端口,这样可检测和防止不同的应用程序同时使用同一端口引起的冲突。如果你怕麻烦,直接用_inp、_outp操作端口也未尝不可,只要没有其它的程序也使用这个端口。既然能使用_inp、_outp函数,当然就能使用插入汇编的方式直接用in、out指令,例如:
    push dx
    mov  dx, 0x3f8
    out  dx, 100
    pop  dx
    事实上,_inp、_outp就是这样的代码。