程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> I/O端口讀寫的實現

I/O端口讀寫的實現

編輯:關於C++

細心的讀者會發現,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)
{
//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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved