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

BCB 硬體端口直接讀寫:__emit__ 內嵌組合語言實現 inportb/outportb

     編輯:VC 教學

原理

BCB 編譯器支援 __emit__ 伪指令,可將機器碼直接嵌入代碼流。利用 x86 IN AL, DX / OUT DX, AL 指令,繞過 Windows HAL,直接操作 I/O 埠。**僅適用於 32 位應用運行於 Windows 9x/NT 虛擬機監控器允許的情況** (需 IOPL=3 或 VxD 支援),**Windows 2000/XP/後續版本預設禁止 Ring 3 I/O 指令,會觸發 EXCEPTION_PRIV_INSTRUCTION 崩潰**。

實現代碼

// 讀取 8 位端口
unsigned char __fastcall inportb(unsigned short port) {
    unsigned char value;
    __emit__(0x8B, 0x95, &port); // MOV EDX, [EBP+offset(port)]  — 將端口地址載入 EDX
    __emit__(0x66, 0xEC);        // IN AL, DX                 — 從端口讀入 AL
    __emit__(0x88, 0x85, &value); // MOV [EBP+offset(value)], AL — 存回 value
    return value;
}

// 寫入 8 位端口
void __fastcall outportb(unsigned short port, unsigned char value) {
    __emit__(0x8B, 0x95, &port); // MOV EDX, port
    __emit__(0x8A, 0x85, &value); // MOV AL, value
    __emit__(0x66, 0xEE);        // OUT DX, AL
}

機器碼解析

位元組指令說明
8B 95 xx xxMOV EDX, [EBP+disp]從堆疊框架取 port 參數到 EDX
66 ECIN AL, DX操作數前綴 0x66 (16位) + IN AL,DX
88 85 xx xxMOV [EBP+disp], AL將 AL 存回區域變量 value
8A 85 xx xxMOV AL, [EBP+disp]取 value 到 AL
66 EEOUT DX, AL操作數前綴 0x66 + OUT DX,AL

極其重要的限制與替代方案

⚠️ 警告:
1. **Windows NT 內核 (含 2000/XP/Vista/7/10/11) 預設 Ring 3 執行 IN/OUT 會觸發特權指令異常 (0xC0000096)**。
2. 僅在 Windows 9x、或載入特殊 VxD (如 giveio.sys, inpout32.sys, winio.sys) 設置 IOPL=3 時可用。
3. 現代硬體 (USB/PCIe/ACPI) 多為記憶體映射 I/O (MMIO),傳統 I/O 埠空間已極少使用。
4. **嚴禁用於生產環境驅動/服務**,極易導致系統不穩定/藍屏/安全漏洞。

正規跨平台解決方案

方案原理適用場景
inpout32.dll / inpoutx64.dll簽名驅動映射 I/O 埠到用戶態舊式 ISA/PCI 卡、並口/串口舊設備、教學演示
WinRing0 (Ring0.dll)開源驅動支援 MSR/PCI Config/I/O超頻工具、硬體監控、風扇控制
Windows Driver Kit (WDK) + KMDF編寫正規內核驅動,暴露 IOCTL 給用戶態所有新硬體驅動、生產級項目
libusb / WinUSB用戶態 USB 協議驅動USB 設備 (無需寫驅動)
Linux: ioperm()/iopl() + inb()/outb()內核支援用戶態 I/O (需 root/CAP_SYS_RAWIO)Linux 嵌入式、工控

總結

__emit__ 內嵌 I/O 指令是「黑魔法」,理解其機制有助於掌握 x86 I/O 與 Windows 權限模型,**但實際工程中請務必選用正規驅動/用戶態庫**,確保穩定、安全、跨版本相容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved