龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

I/O端口读写的实现

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
细心的读者会发现,C++Builder不再支持如inportb()、outportb()一类I/O端口读写指令了。准确地说,在Windows环境下,BorlandC++仅支持16位应用程序的端口操作,对32位应用程序的端口操作不再支

  细心的读者会发现,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;

  

}

  

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!

热评话题

按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接