C++Builder下实现端口读写 (文/鲁军 张民国 张剑) ---- 本文介绍怎样在C＋＋Builder下实现端口读写，并举出一个具体例子。 ### __emit__ 函 数 介 绍 ----__emit__ 函数一般极少用到，通过使用C＋＋Builder的Help菜单，可得到该函数的联机帮助信息。 ----__emit__函数用法为： void __emit__（argument， ． ． ．）； ----该函数为C＋＋Builder一个内部函数，调用的参数为机器语言指令。它在编译的时侯，将机器语言指令直接嵌入目标码中，不必借助于汇编语言和汇编编译程序。在BorlandC＋＋中，它的原型在头文件中说明,而C＋＋Builder的编译器能自动认识它,不必加入头文件。 ----该函数无返回值。 ----下面利用该函数定义一个inportb和outportb函数，使之具有BorlandC＋＋中inportb和outportb函数的功能。
    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 寄 存 器 中 的 值 送 到 端 口

        }
---- 这个outportb函数调用后，把value参数指定的值送到port参数指定的端口。
      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；// 返 回 函 数 值

    }
----这个inportb函数调用后，从port参数指定的端口读入并返回一个字节。 ----如果用户想使用__emit__函数，必须熟悉80x86处理器族的机器语言指令。如果调用的参数是错误机器语言指令，则程序将非正常运行，并很容易导致死机。 ### 应 用 举 例 ---- 本程序的编程环境是Win98操作系统和C＋＋Builder4.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,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；

             }
---- 也可将inportb和outportb函数的实现放在单元文件的．cpp文件中。C＋＋Builder支持成员函数的实现放在类体内或类体外的C＋＋标准。 ----分别双击两个Button控件，产生OnClick事件函数。在单元文件的．cpp文件添加如下代码：
       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 的 端 口 读 入 数 据

      }
----上面是一个对I/O端口进行读写操作的简单例子，只要将定义inportb和outportb函数的代码如上所述包含到单元文件中，通过调用可方便地实现I/O端口读写。