| 在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程式設計語言。 |