头文件中说明,而C++Builder的编译器能自动认识它,不必加入头文件。
----该函数无返回值。
----下面利用该函数定义一个inportb和outportb函数,使之具有BorlandC++中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++Builder4.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端口读写。