Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2338093
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:08:19

我看了你的读取硬盘参数的程序,怎么反而win9x不能用汇编呢?我一直用的是win98,也曾在win95,win97中用过,是如下编写的,用得很稳定!还没有用过winIo,我是不是搞错了?我没有winNT,反而不知道能行不?你帮我试一试!
//---------------------------------------------------------------------------
void __fastcall outportb(unsigned short int port, unsigned char value)
{
       __emit__(0x8b, 0x95, &port);
       // mov al, *(&value);
       __emit__(0x8a, 0x85, &value);
       // out dx, al;
       __emit__(0x66, 0xee);

}
//---------------------------------------------------------------------------
void __fastcall outportw(unsigned short int port, unsigned short int value)
{
       // mov edx, *(&port);
       __emit__(0x8b, 0x95, &port);
       // mov ax, *(&value);
       __emit__(0x8b, 0x85, &value);
       // out dx, ax;
       __emit__(0xef);

}
//---------------------------------------------------------------------------
unsigned char __fastcall inportb(unsigned short int port)
{
       unsigned char value;
       // mov edx, *(&port);
       __emit__(0x8b, 0x95, &port);
       // in al, dx;
       __emit__(0x66,0xec);
       // mov *(&value), al;
       __emit__(0x88, 0x85, &value);
       return value;

}
//---------------------------------------------------------------------------
unsigned short int __fastcall inportw(unsigned short int port)
{
       union {
        unsigned short int val;
        unsigned char cc[2];
             }kp;
        kp.cc[0]=inportb(port);
        kp.cc[1]=inportb(port+1);
        return kp.val;
}


--------------------next---------------------
汇编编译出来的机器码,就是__emit__的内容。

WinNT 内核的系统 (WinNT/Win2000/WinXP/Win2003/LongHorn) 都禁止使用 in/out 指令直接访问端口
所以你的程序根本无法在 NT 内核的系统下运行,是真正的“非法操作”

在 Win98 下,某些端口是可以用 in/out 指令直接访问的,我曾经用你的方法在 Win98 下访问过并行口,是没问题的。
也有些无法访问,硬盘的端口就无法访问,甚至在 Win98 的 DOS 窗口下执行 DOS 版本的访问硬盘端口的程序都不可以。

WinIo 是一个访问硬件端口的通用控件,在大多数语言里面都可以用,包括 BCB, Delphi, VC, VB 等。
如果在程序里面装载了 WinIo, 用你的方法可以在 NT 内核的系统里面直接访问端口,允许用 in/out 指令了,
但是这个程序在 Win98 里面没有直接的效果,原来能够访问的还能访问,原来不能访问的仍然不能访问,
只有通过 WinIo 里面提供的函数 (通过 VxD 实现的),来访问 Win9x 里面不允许访问的端口。

--------------------next---------------------

阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~