本文介绍怎样在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, 0×95, &port);
// 把端口地址送到处理器
32 位EDX 寄存器中
_emit_(0x8a, 0×85, &value);
// 把value 送到处理器8 位AL 寄存器中
_emit_(0×66, 0xee);
// 把AL 寄存器中的值送到端口
}
这个outportb 函数调用后,把value 参数指定的值送到port 参数指定的端口。
unsigned char inportb(unsigned short int port)
//port 参数为输入端口地址
{
unsigned char value;
// 指定变量value 为无符号字符型
_emit_(0x8b, 0×95, &port);
// 把端口地址送到处理器
32 位EDX 寄存器中
_emit_(0×66, 0xec);
// 从指定端口中将一数据
字节送到8 位AL 寄存器中
_emit_(0×88, 0×85, &value);
// 把AL 寄存器中的值赋给value
return value;// 返回函数值
}
这个inportb 函数调用后,从port 参数指定的端口读入并返回一个字节。
如果用户想使用_emit_ 函数,必须熟悉80×86 处理器族的机器语言指令。如果调用的参数是错误机器语言指令,则程序将非正常运行,并很容易导致死机。
应用举例
本程序的编程环境是Win98 操作系统和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,0×95, &port);
_emit_(0x8a,0×85, &value);
_emit_(0×66, 0xee);
}
// ------------
unsigned char inportb(unsigned short int port)
{
unsigned char value;
_emit_(0x8b, 0×95, &port);
_emit_(0×66, 0xec);
_emit_(0×88, 0×85, &value);
return value;
}
也可将inportb 和outportb 函数的实现放在单元文件的.cpp 文件中。C ++Builder 支持成员函数的实现放在类体内或类体外的C ++标准。
分别双击两个Button 控件,产生OnClick 事件函数。在单元文件的.cpp 文件添加如下代码:
void _fastcall TForm1::Button1Click
(TObject *Sender) {
outportb(0x2c0,0×00);
// 向地址为2c0H 的端口输出数据
outportb(0x2c1,0×00);
// 向地址为2c1H 的端口输出数据
}
// -------------
void _fastcall TForm1::Button2Click
(TObject *Sender)
{
int i;
i=inportb(0x2c2);
// 从地址为2c2H 的端口读入数据
}
上面是一个对I/O 端口进行读写操作的简单例子,只要将定义inportb 和outportb 函数的代码如上所述包含到单元文件中,通过调用可方便地实现I/O 端口读写。
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能