C++Builder下實現對連接埠讀寫的兩種方法

來源:互聯網
上載者:User
C++Builder下實現對連接埠讀寫的兩種方法

2000-08-16 14:15:07

  在C++Builder中,不能夠使用Turbo C中的outputb和inputb連接埠讀寫函數。但我們可以有另外兩種辦法實現這個功能。本文介紹怎樣在C++Builder下實現連接埠讀寫,並給出兩種方法的原始碼。

  在C++Builder下對連接埠的讀寫共有兩種方法,一種為內嵌組合語言,另一種為使用__emit__函數。

1 通過內嵌組合語言實現連接埠的讀寫

在C++Builder中,彙編語句必須被包含在以關鍵字asm為起始的一對大括弧中:

asm {

彙編語句1

……

}

利用內嵌組合語言編製連接埠輸出函數如下:

void OutPort(unsigned short port,unsigned char value)

//port參數為輸出連接埠地址,value參數為輸出值

{

  asm{

    mov dx , port //把連接埠地址送到處理器DX寄存器中

    mov al , value // 把value 送到處理器AL寄存器中

    out dx , al // 把AL寄存器中的值送到連接埠

};

}

該函數將無符號字元型8位的資料value寫入地址為port的連接埠上,port的資料類型是unsigned short ,16位無符號短整形。

利用內嵌組合語言編製連接埠輸入函數如下:

unsigned char InPort(unsigned short port)

//port參數為輸入連接埠地址,返回為輸入值

{

  unsigned char value ;

  asm{

    mov dx , port // 把連接埠地址送到處理器DX寄存器中

    in al, dx // 從DX指定連接埠中將一資料送到AL寄存器中

    mov ind , value // 把AL寄存器中的值賦給value

    };

  return value; //返回連接埠資料

}

函數InPort從地址為port的連接埠讀入一個無符號8位的字元型資料,其其參數只一個,即連接埠號碼。返回的資料為unsigned char類型的,為從連接埠讀取的值。

2 通過__emit__函數實現連接埠的讀寫

__emit__ 函數一般極少用到。其用法如下:

void _ _emit_ _(argument, . . .);

該函數為C++Builder 的一個內建函式,調用的參數為機器語言指令。它在編譯的時侯,將機器語言指令直接嵌入目標碼中,不必藉助於組合語言和彙編編譯器。

如果想使用__emit__ 函數,必須熟悉80x86處理器的機器語言指令。如果調用的參數是錯誤機器語言指令,則程式將非正常運行,並很容易導致死機。

利用__emit__函數編製連接埠輸出函數如下:

void OutPort(unsigned short port,unsigned char value)

//port參數為輸出連接埠地址,value參數為輸出值

{

    __emit__(0x8b,0x95,&port); // 把連接埠地址送到處理器EDX寄存器中

    __emit__(0x8a,0x85,&value); // 把value 送到處理器AL寄存器中

    __emit__(0x66,0xee); // 把AL寄存器中的值送到連接埠

}

利用__emit__函數編製連接埠輸入函數如下:

unsigned char InPort(unsigned short port)

//port參數為輸入連接埠地址,返回為輸入值

{

   unsigned char value ;

    __emit__(0x8b,0x95,&port) ; // 把連接埠地址送到處理器DX寄存器中

    __emit__(0x66,0xec); // 從DX指定連接埠中將一資料送到AL寄存器中

    __emit__(0x88,0x85,&value); // 把AL寄存器中的值賦給value

   return value; //返回連接埠資料

}

由這兩種方法所編製的函數注釋可以看出,它們每一句的功能都是一樣的,只是一個是嵌入了組合語言,另一個是直接使用機器語言。

3 應用舉例

在C++Builder中,通過File/New Application菜單建立一工程。

在表單中加兩個Button控制項,Caption分別為“寫連接埠”和“讀連接埠”。

將第一種方法所編製的OutPort和InPort函數拷貝到表單的標頭檔中,並把這兩個函數作為表單類的在表單類的公有成員函數。

分別雙擊兩個Button控制項,產生OnClick事件函數。在單元檔案的.cpp檔案添加如下代碼:

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

OutPort(0x378,0x00);//向地址為378H的連接埠輸出資料

OutPort(0x379,0x00);//向地址為379H的連接埠輸出資料

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

int value;

value=InPort(0x37a);//從地址為37aH的連接埠讀入資料

}

//---------------------------------------------------------------------------

(注意,連接埠0x378-0x37f為列印口的I/O口,通過這種方法可以實現的印表機的控制。)

編譯運行。

將將第二種方法所編製的OutPort和InPort函數拷貝到表單的標頭檔中,並把這兩個函數作為表單類的在表單類的公有成員函數,以替代掉第一種方法所編製的OutPort和InPort函數。再編譯運行,結果完全一樣。

本程式的編程環境是Win98作業系統和C++Builder5.0程式設計語言。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.