首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

BCB 以 __emit__ 內嵌組合語言讀寫硬體 I/O 埠

     編輯:關於C++

概述

Borland C++ Builder (BCB) 提供 __emit__ 關鍵字,允許在 C++ 程式碼中直接嵌入機器碼(Opcode),從而實現繞過編譯器、直達 CPU 指令層級的操作。這可用於讀寫硬體 I/O 埠(如並口、序口控制暫存器),但屬於 Ring 0 權限操作,在現代受保護模式作業系統(Windows NT/2000/XP/Vista/7/10/11)下直接執行會導致權限違規例外(Access Violation),甚至系統藍屏。僅適用於 Windows 9x/Me 或具備核心模式驅動程式協助的環境。

實作程式碼

讀取單一位元組 inportb(port)

unsigned char __fastcall inportb(unsigned short int port)
{
    unsigned char value;
    // 將 port 位址載入 EDX
    __emit__(0x8B, 0x95, &port);   // mov edx, [ebp+port]
    // 從 I/O 埠讀入 AL(IN AL, DX)
    __emit__(0x66, 0xEC);          // in al, dx  (0x66 為 operand-size override)
    // 將 AL 存入 value
    __emit__(0x88, 0x85, &value);  // mov [ebp+value], al
    return value;
}

寫入單一位元組 outportb(port, value)

void __fastcall outportb(unsigned short int port, unsigned char value)
{
    // 將 port 位址載入 EDX
    __emit__(0x8B, 0x95, &port);   // mov edx, [ebp+port]
    // 將 value 載入 AL
    __emit__(0x8A, 0x85, &value);  // mov al, [ebp+value]
    // 寫入 I/O 埠(OUT DX, AL)
    __emit__(0x66, 0xEE);          // out dx, al
}

指令解析

指令碼組合語言說明
8B 95 xx xxmov edx, [ebp+offset]將區域變數 port 位址載入 EDX(I/O 埠位址暫存器)
66 ECin al, dx從 DX 指定的埠讀 1 位元組到 AL(0x66 表示 16-bit 埠位址)
88 85 xx xxmov [ebp+offset], al將 AL 存回區域變數 value
8A 85 xx xxmov al, [ebp+offset]將區域變數 value 載入 AL
66 EEout dx, al將 AL 寫入 DX 指定的埠

⚠️ 重大限制與替代方案

  • Windows NT 核心系列(含 XP/7/10/11)禁止使用者模式程式執行 IN/OUT 指令,嘗試執行會觸發 EXCEPTION_PRIV_INSTRUCTION (0xC0000096)。
  • 若需在現代 Windows 控制硬體,請採用下列正規管道:
    • 撰寫核心模式驅動程式 (KMDF/WDM) 配合 READ_PORT_UCHAR/WRITE_PORT_UCHAR。
    • 使用 CreateFile 開啟 \\.\GIVEIO、\\.\IO 等第三方驅動(如 WinIO、InpOut32)暴露的裝置介面。
    • 透過標準序口/並口 API(CreateFile, DeviceIoControl)操作 COM/LPT。
    • USB/PCI/PCIe 裝置請依據裝置類別撰寫對應驅動或使用 WinUSB/libusb。
  • 本範例僅具教學與維護舊系統(DOS/Win9x)價值,嚴禁用於現代產品開發。

延伸閱讀

  • Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2: Instruction Set Reference (IN, OUT 指令編碼)
  • 《Windows 核心程式設計》第 9 章:硬體存取與驅動開發
  • InpOut32 / WinIO 開源專案:提供使用者模式 I/O 埠存取封裝
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved