asm基礎(chǔ)——匯編指令之in/out指令
x86中的IO端口訪問
匯編是直接面向硬件的,它可以訪問系統(tǒng)的mem空間,也可以直接訪問系統(tǒng)的io空間。
匯編中使用in/out來訪問系統(tǒng)的io空間。
IN
從端口輸入
OF |
DF |
IF |
SF |
ZF |
AF |
PF |
CF |
說明:從端口輸入一個字節(jié)或字到AL或AX中(IA-32處理器上可以輸入一個雙字到EAX)。源操作數(shù)是端口地址,可以是8位的常量或者DX中的一個16位地址。
指令格式:
in accum, imm (應(yīng)該不需要是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 |
說明:將累加器中的一個字節(jié)或字輸出到端口(IA-32處理器上可以向端口輸出一個雙字)。端口地址如果在范圍0-FFh之間,可以是一個常量,也可以在DX中存放0-FFFFh之間的端口地址。
指令格式:
out imm8, accum(應(yīng)該不需要是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地址要么是立即數(shù),要么放在dx寄存器中;而數(shù)據(jù)也都放在al/ax/eax寄存器中,不能是其他寄存器。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
匯編語言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解
這篇文章主要為大家介紹了匯編語言80x86系統(tǒng)通用的數(shù)據(jù)傳送指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明VFR文件
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明VFR文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06匯編語言AND指令實現(xiàn)對兩個操作數(shù)進(jìn)行邏輯(按位)與操作
這篇文章主要介紹了匯編語言AND指令實現(xiàn)對兩個操作數(shù)進(jìn)行邏輯(按位)與操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01