端口映射:CB下实现对端口读写的两种方法



在cbuilder中不能够使用turbo c中outputb和inputb端口读写但我们可以有另外两种办法实现这个功能本文介绍怎样在cbuilder下实现端口读写并给出两种思路方法源代码
在cbuilder下对端口读写共有两种思路方法种为内嵌汇编语言种为使用__emit__

1 通过内嵌汇编语言实现端口读写

在cbuilder中汇编语句必须被包含在以关键字asm为起始对大括号中:

asm {

汇编语句1

……

}

利用内嵌汇编语言编制端口输出如下:

void outport(unsigned 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 16位无符号短整形
利用内嵌汇编语言编制端口输入如下:

unsigned char inport(unsigned port)//port参数为输入端口地址返回为输入值
{
  unsigned char value ;
 asm{
     mov dx , port // 把端口地址送到处理器dx寄存器中
     in al, dx // 从dx指定端口中将数据送到al寄存器中
     mov ind , value // 把al寄存器中值赋给value
     };
   value; //返回端口数据
}

inport从地址为port端口读入个无符号8位型数据其其参数只即端口号返回数据为unsigned char类型为从端口读取


2 通过__emit__实现端口读写

__emit__ 般极少用到其使用方法如下:

void _ _emit_ _(argument, . . .);

为c++builder 个内部参数为机器语言指令它在编译时侯将机器语言指令直接嵌入目标码中不必借助于汇编语言和汇编编译
如果想使用__emit__ 必须熟悉80x86处理器机器语言指令如果参数是机器语言指令将非正常运行,并很容易导致死机

利用__emit__编制端口输出如下:

void outport(unsigned 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 port)//port参数为输入端口地址返回为输入值
{
  unsigned char value ;
 __emit__(0x8b,0x95,&port) ; // 把端口地址送到处理器dx寄存器中
 __emit__(0x66,0xec); // 从dx指定端口中将数据送到al寄存器中
 __emit__(0x88,0x85,&value); // 把al寄存器中值赋给value
   value; //返回端口数据
}

由这两种思路方法所编制注释可以看出它们每功能都是只是个是嵌入了汇编语言个是直接使用机器语言


3 应用举例

在cbuilder中通过file/ application菜单新建工程

在表单中加两个buttonControl控件caption分别为“写端口”和“读端口”

将第种思路方法所编制outport和inport拷贝到表单头文件中并把这两个作为表单类在表单类公有成员

分别双击两个buttonControl控件产生onclick事件在单元文件.cpp文件添加如下代码:

//---------------------------------------------------------------------------

void __fastcall tform1::button1click(tobject *sender)

{
  outport(0x378,0x00);//向地址为378h端口输出数据
  outport(0x379,0x00);//向地址为379h端口输出数据
}

//---------------------------------------------------------------------------

void __fastcall tform1::button2click(tobject *sender)

{
   value;
  value=inport(0x37a);//从地址为37ah端口读入数据
}

//---------------------------------------------------------------------------

(注意端口0x378-0x37f为打印口i/o口通过这种思路方法可以实现打印机控制)

编译运行

将将第 2种思路方法所编制outport和inport拷贝到表单头文件中并把这两个作为表单类在表单类公有成员以替代掉第种思路方法所编制outport和inport再编译运行结果完全
Tags:  80端口 qq端口 端口扫描 端口映射

延伸阅读

最新评论

发表评论