副标题#e#
在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; //返回端口数据
}
#p#副标题#e#
函数InPort从地点为port的端口读入一个无标记8位的字符型数据,其其参数只一个,即端标语。返回的数据为unsigned char范例的,为从端口读取的值。
2 通过__emit__函数实现端口的读写
__emit__ 函数一般极罕用到。其用法如下:
void _ _emit_ _(argument, . . .);
该函数为C++Builder 的一个内部函数,挪用的参数为呆板语言指令。它在编译的时侯,将呆板语言指令直接嵌入方针码中,不必借助于汇编语言和汇编编译措施。
假如想利用__emit__ 函数,必需熟悉80×86处理惩罚器的呆板语言指令。假如挪用的参数是错误呆板语言指令,则措施将非正常运行,并很容易导致死机。
操作__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编程语言。