当前位置:天才代写 > tutorial > C语言/C++ 教程 > CB下实现对端口读写的两种要领

CB下实现对端口读写的两种要领

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:805

副标题#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; //返回端口数据
}

#p#副标题#e#

由这两种要领所体例的函数注释可以看出,它们每一句的成果都是一样的,只是一个是嵌入了汇编语言,另一个是直接利用呆板语言。

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编程语言。

 

    关键字:

天才代写-代写联系方式