C++Builder下實現埠讀寫 (轉)

worldblog發表於2007-12-06
C++Builder下實現埠讀寫 (轉)[@more@]

C++Builder下實現埠讀寫
  轉載自《世界日報》(文/魯軍張民國張劍)
  ----本文介紹怎樣在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處理器族的機器語言指令。如果呼叫的引數是錯誤機器語言指令,則程式將非正常執行,並很容易導致當機。

應用舉例
  ----本程式的環境是操作和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(T*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埠讀寫。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988867/,如需轉載,請註明出處,否則將追究法律責任。

相關文章