細(xì)心的讀者會(huì)發(fā)現(xiàn),C++Builder不再支持如inportb()、outportb()一類(lèi)I/O端口讀寫(xiě)指令了。準(zhǔn)確地說(shuō),在Windows環(huán)境下,BorlandC++僅支持16位應(yīng)用程序的端口操作,對(duì)32位應(yīng)用程序的端口操作不再支持,而C++Builder開(kāi)發(fā)出來(lái)的程序是32位的。我個(gè)人以為,這是C++Builder設(shè)計(jì)者的敗筆。因?yàn)镻C機(jī)中,I/O地址空間與內(nèi)存地址空間從來(lái)都是各自獨(dú)立的。看看Delphi,不就通過(guò)Port數(shù)組實(shí)現(xiàn)了對(duì)I/O端口的訪(fǎng)問(wèn)了嗎?搞不清楚為什么C++Builder就沒(méi)有提供類(lèi)似的機(jī)制?下面這幾個(gè)函數(shù)是筆者從網(wǎng)上淘下來(lái)的,經(jīng)過(guò)驗(yàn)證,在Windows95環(huán)境下,的確可實(shí)現(xiàn)對(duì)I/O端口的讀寫(xiě)。讀者可以借鑒使用。
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;
}