• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C++Builder下實現端口讀寫

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    軍械工程學院測控研究室 魯 軍 張民國 張 劍 本文介紹怎樣在C ++Builder 下實現端口讀寫,并舉出一個具體例子。 _emit_ 函數介紹 _emit_ 函數一般極少用到,通過使用C ++Builder 的Help 菜單,可得到該函數的聯機幫助信息。 _emit_ 函數用法為: void _em
    軍械工程學院測控研究室 魯 軍 張民國 張 劍

      本文介紹怎樣在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, 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 ++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,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 端口讀寫?! ?/p>

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>