x86中的IO端口訪問
匯編是直接面向硬件的,它可以訪問系統的mem空間,也可以直接訪問系統的io空間。
匯編中使用in/out來訪問系統的io空間。
IN
從端口輸入
OF |
DF |
IF |
SF |
ZF |
AF |
PF |
CF |
說明:從端口輸入一個字節或字到AL或AX中(IA-32處理器上可以輸入一個雙字到EAX)。源操作數是端口地址,可以是8位的常量或者DX中的一個16位地址。
指令格式:
in accum, imm (應該不需要是8位,可以是16位,比如3F8h)
in accum, dx
下面是一個例子,對in做了一層包裝:
UINT8
IoRead8 (
IN UINTN Port
)
{
UINT8 Data;
__asm {
mov dx, word ptr [Port]
in al, dx
mov Data, al
}
return Data;
}
OUT
輸出到端口。
OF |
DF |
IF |
SF |
ZF |
AF |
PF |
CF |
說明:將累加器中的一個字節或字輸出到端口(IA-32處理器上可以向端口輸出一個雙字)。端口地址如果在范圍0-FFh之間,可以是一個常量,也可以在DX中存放0-FFFFh之間的端口地址。
指令格式:
out imm8, accum(應該不需要是8位,可以是16位,比如3F8h)
out dx, accum
下面是一個例子,對out做了一層包裝:
UINT8
IoWrite8 (
IN UINTN Port,
IN UINT8 Value
)
{
__asm {
mov al, byte ptr [Value]
mov dx, word ptr [Port]
out dx, al
}
return Value;
}
注意,io地址要么是立即數,要么放在dx寄存器中;而數據也都放在al/ax/eax寄存器中,不能是其他寄存器。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!