I/O 端口读写的实现 (C++ Builder)

来源(怡园)

From: http://yynets.best.163.com/cbuilder.htm

I/O 端口读写的实现 (C++ Builder)

细心的读者会发现, C++ Builder 不再支持如 inportb() 、 outportb() 一类 I/O 端口读写指令了。准确地说,在 Windows 环境下, Borland C++ 仅支持 16 位应用程序的端口操作,对 32 位应用程序的端口操作不再支持 , 而 C++ Builder 开发出来的程序是 32 位的。我个人以为,这是 C++ Builder 设计者的败笔。因为 PC 机中, I/O 地址空间与内存地址空间从来都是各自独立的。看看 Delphi ,不就通过 Port 数组实现了对 I/O 端口的访问了吗?搞不清楚为什么 C++ Builder 就没有提供类似的机制?下面这几个函数是笔者从网上淘下来的,经过验证,在 Windows95 环境下,的确可实现对 I/O 端口的读写。读者可以借鉴使用。

void outportb(unsigned short int port, unsigned char value) {

    // mov edx, *(&port);
    __emit__(0x8b, 0x95, &port);
    // mov al, *(&value);
    __emit__(0x8a, 0x85, &value);
    // out dx, al;
    __emit__(0x66, 0xee);
}

void outportw(unsigned short int port, unsigned short int value) {

    // mov edx, *(&port);
    __emit__(0x8b, 0x95, &port);
    // mov ax, *(&value);
    __emit__(0x66, 0x8b, 0x85, &value);
    // out dx, ax;
    __emit__(0xef);
}

unsigned char 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 inportw(unsigned short int port) {

    unsigned short int value;
    // mov edx, *(&port);
    __emit__(0x8b, 0x95, &port);
    // in ax, dx

    __emit__(0xed);
    // mov *(&value), ax

    __emit__(0x66, 0x89, 0x85, &value);
    return value;
}


Link: http://www.asm32.net/article_details.aspx?id=1899


浏览次数 377 发布时间 2006-08-25 05:49:14 从属分类 C/C++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1