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