📄 20000725002.htm
字号:
<HTML>
<HEAD>
<TITLE>C++Builder下实现端口读写</TITLE>
<META content="Microsoft FrontPage 4.0" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align=center><font size=5><strong><b><font size="3"><br>
C++Builder下实现端口读写</font></b></strong></font></p>
<p align=right> (文/鲁军 张民国 张剑)</p>
<p class=sfont><font color=#ffffff>----</font> 本文介绍怎样在C++Builder下实现端口读写,并举出一个具体例子。
<h3>__emit__ 函 数 介 绍 </h3>
<p class=sfont><font
color=#ffffff>----</font>__emit__ 函数一般极少用到,通过使用C++Builder的Help菜单,可得到该函数的联机帮助信息。
<p><font color=#ffffff>----</font>__emit__函数用法为: <br>
void __emit__(argument, . . .);
<p><font color=#ffffff>----</font>该函数为C++Builder一个内部函数,调用的参数为机器语言指令。它在编译的时侯,将机器语言指令直接嵌入目标码中,不必借助于汇编语言和汇编编译程序。在BorlandC++中,它的原型在<dos.h>头文件中说明,而C++Builder的编译器能自动认识它,不必加入头文件。
<p><font color=#ffffff>----</font>该函数无返回值。
<p><font color=#ffffff>----</font>下面利用该函数定义一个inportb和outportb函数,使之具有BorlandC++中inportb和outportb函数的功能。
<pre>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 寄 存 器 中 的 值 送 到 端 口
}</pre>
<p><font color=#ffffff>----</font> 这个outportb函数调用后,把value参数指定的值送到port参数指定的端口。
<pre> 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;// 返 回 函 数 值
}</pre>
<p><font color=#ffffff>----</font>这个inportb函数调用后,从port参数指定的端口读入并返回一个字节。
<p><font color=#ffffff>----</font>如果用户想使用__emit__函数,必须熟悉80x86处理器族的机器语言指令。如果调用的参数是错误机器语言指令,则程序将非正常运行,并很容易导致死机。
<h3>应 用 举 例 </h3>
<p class=sfont><font color=#ffffff>----</font> 本程序的编程环境是Win98操作系统和C++Builder4.0编程语言。
<p><font color=#ffffff>----</font>启动C++Builder4.0,激活菜单File/New
Application,创建一个工程。在表单上添加两个Button控件。各对象属性设置如下:
<pre> 构 件 名 称 属 性 属 性 值
表 单 构 件 Name Form1
Caption 读 写 端 口
命 令 按 钮 Name Button1
Caption 写 端 口
命 令 按 钮 Name Button2
Caption 读 端 口</pre>
<p><font color=#ffffff>----</font>在单元文件的.h文件添加如下代码:
<pre> 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;
} </pre>
<p><font color=#ffffff>----</font> 也可将inportb和outportb函数的实现放在单元文件的.cpp文件中。C++Builder支持成员函数的实现放在类体内或类体外的C++标准。
<p><font color=#ffffff>----</font>分别双击两个Button控件,产生OnClick事件函数。在单元文件的.cpp文件添加如下代码:
<pre> 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 的 端 口 读 入 数 据
} </pre>
<p><font color=#ffffff>----</font>上面是一个对I/O端口进行读写操作的简单例子,只要将定义inportb和outportb函数的代码如上所述包含到单元文件中,通过调用可方便地实现I/O端口读写。</p>
</td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -