C++Builder下實現埠讀寫 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (11.1)iic串列埠讀寫EEPROM實驗:EEPROM介紹串列埠
- 3、使用Windows命令來實現埠轉發Windows
- ShardingSphere(七) 讀寫分離配置,實現分庫讀寫操作
- ProxySQL實現MySQL讀寫分離MySql
- 使用ProxySQL實現MySQL Group Replication的故障轉移、讀寫分離(一)MySql
- 伺服器實現埠轉發的N種方式伺服器
- 【Mongo】Mongo讀寫分離的實現Go
- node的讀寫流簡易實現
- 7.7 實現程式記憶體讀寫記憶體
- socket 實現的 web 伺服器在 Windows 下的讀寫問題Web伺服器Windows
- CentOS7系統下使用Mycat實現mysql讀寫分離部署CentOSMySql
- 1、實戰SSH埠轉發
- [轉] 如何實現 React 寫小程式-1React
- 基於Sharding-Jdbc 實現的讀寫分離實現JDBC
- PostgreSQL+Pgpool實現HA讀寫分離SQL
- docker+atlas+mysql實現讀寫分離DockerMySql
- Kubernetes 中實現 MySQL 的讀寫分離MySql
- windows 環境 tcp/udp 埠轉發(草稿待寫)WindowsTCPUDP
- 用js實現小寫金額轉大寫的方法JS
- 關於利用go實現非同步讀寫的寫法分享Go非同步
- Spring Aop實現資料庫讀寫分離Spring資料庫
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- SpringBoot 專案優雅實現讀寫分離Spring Boot
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- MHA+ProxySQL實現讀寫分離高可用SQL
- 利用nginx的stream模組實現內網埠的轉發代理Nginx內網
- QT實現串列埠助手中串列埠名的實時更新QT串列埠
- 設定 SSH 隧道(埠轉發)實戰
- MySQL怎麼實現主從同步和Django實現MySQL讀寫分離MySql主從同步Django
- Go 實現埠掃描器Go
- UART串列埠及Linux實現串列埠Linux
- 教你幾行程式碼實現全平臺埠資料的轉發行程
- Mycat中介軟體實現Percona Cluster讀寫分離
- Docker實現Mariadb分庫分表、讀寫分離Docker
- redis客戶端實現高可用讀寫分離Redis客戶端
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- 大資料實踐解析(下):Spark的讀寫流程分析大資料Spark
- 位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?面試
- USB轉re232轉換器(串列埠線)裝置出現感嘆號且裝置管理器下的埠沒有出現,解決辦法串列埠