本文介紹怎樣在C ++Builder
下實現端口讀寫,并舉出一個具體例子。
_emit_ 函數介紹
_emit_ 函數一般極少用到,通過使用C ++Builder 的Help
菜單,可得到該函數的聯機幫助信息。
_emit_ 函數用法為:
void _emit_(argument,...);
該函數為C ++Builder
一個內部函數,調用的參數為機器語言指令。它在編譯的時侯,將機器語言指令直接嵌入目標碼中,不必借助于匯編語言和匯編編譯程序。在Borland
C ++中,它的原型在頭文件中說明, 而C ++Builder
的編譯器能自動認識它, 不必加入頭文件。
該函數無返回值。
下面利用該函數定義一個inportb 和outportb 函數,使之具有Borland C
++中inportb 和outportb 函數的功能。
void outportb(unsigned short int port, unsigned char value)
//port 參數為輸出端口地址,
value 參數為輸出值
{
_emit_(0x8b, 0x95, &port);
// 把端口地址送到處理器
32 位EDX 寄存器中
_emit_(0x8a, 0x85, &value);
// 把value 送到處理器8 位AL 寄存器中
_emit_(0x66, 0xee);
// 把AL 寄存器中的值送到端口
}
這個outportb 函數調用后,把value 參數指定的值送到port
參數指定的端口。
unsigned char inportb(unsigned short int port)
//port 參數為輸入端口地址
{
unsigned char value;
// 指定變量value 為無符號字符型
_emit_(0x8b, 0x95, &port);
// 把端口地址送到處理器
32 位EDX 寄存器中
_emit_(0x66, 0xec);
// 從指定端口中將一數據
字節送到8 位AL 寄存器中
_emit_(0x88, 0x85, &value);
// 把AL 寄存器中的值賦給value
return value;// 返回函數值
}
這個inportb 函數調用后,從port
參數指定的端口讀入并返回一個字節。
如果用戶想使用_emit_ 函數,必須熟悉80x86
處理器族的機器語言指令。如果調用的參數是錯誤機器語言指令,則程序將非正常運行,并很容易導致死機。
應用舉例
本程序的編程環境是Win98 操作系統和C ++Builder 4.0 編程語言。
啟動C ++Builder4.0, 激活菜單File/New Application,
創建一個工程。在表單上添加兩個Button
控件。各對象屬性設置如下:
構件名稱 屬性 屬性值
表單構件 Name Form1
Caption 讀寫端口
命令按鈕 Name Button1
Caption
寫端口
命令按鈕 Name Button2
Caption
讀端口
在單元文件的.h 文件添加如下代碼:
public:
// 聲明inportb 和outportb
函數為公有成員函數
void _fastcall outportb
(unsigned short int port, unsigned char value) {
_emit_(0x8b,0x95, &port);
_emit_(0x8a,0x85, &value);
_emit_(0x66, 0xee);
}
// ------------
unsigned char inportb(unsigned short int port)
{
unsigned char value;
_emit_(0x8b, 0x95, &port);
_emit_(0x66, 0xec);
_emit_(0x88, 0x85, &value);
return value;
}
也可將inportb 和outportb 函數的實現放在單元文件的.cpp 文件中。C
++Builder 支持成員函數的實現放在類體內或類體外的C ++標準。
分別雙擊兩個Button 控件,產生OnClick 事件函數。在單元文件的.cpp
文件添加如下代碼:
void _fastcall TForm1::Button1Click
(TObject *Sender) {
outportb(0x2c0,0x00);
// 向地址為2c0H 的端口輸出數據
outportb(0x2c1,0x00);
// 向地址為2c1H 的端口輸出數據
}
// -------------
void _fastcall TForm1::Button2Click
(TObject *Sender)
{
int i;
i=inportb(0x2c2);
// 從地址為2c2H 的端口讀入數據
}
上面是一個對I/O 端口進行讀寫操作的簡單例子,只要將定義inportb
和outportb
函數的代碼如上所述包含到單元文件中,通過調用可方便地實現I/O
端口讀寫?! ?/p>