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 xx | mov edx, [ebp+offset] | 將區域變數 port 位址載入 EDX(I/O 埠位址暫存器) |
| 66 EC | in al, dx | 從 DX 指定的埠讀 1 位元組到 AL(0x66 表示 16-bit 埠位址) |
| 88 85 xx xx | mov [ebp+offset], al | 將 AL 存回區域變數 value |
| 8A 85 xx xx | mov al, [ebp+offset] | 將區域變數 value 載入 AL |
| 66 EE | out dx, al | 將 AL 寫入 DX 指定的埠 |
EXCEPTION_PRIV_INSTRUCTION (0xC0000096)。READ_PORT_UCHAR/WRITE_PORT_UCHAR。CreateFile 開啟 \\.\GIVEIO、\\.\IO 等第三方驅動(如 WinIO、InpOut32)暴露的裝置介面。CreateFile, DeviceIoControl)操作 COM/LPT。