I/O端口读写的实现

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

细心的读者会发现,C++Builder不再支持如inportb()、outportb()一类I/O端口读写指令了。准确地说,在Windows环境下,BorlandC++仅支持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)

{

//move dx,*(&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)

{

//move dx,*(&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;

//move dx,*(&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;

//move dx,*(&port);

__emit__(0x8b,0x95,&port);

//in ax,dx

__emit__(0xed);

//mov *(&value),ax

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

return value;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航