中斷與埠讀寫

2021-08-02 00:26:06 字數 4129 閱讀 3280

中斷:cpu不再接著剛執行完的指令向下執行,而是轉去處理中斷資訊

內中斷:由cpu內部發生的事件而引起的中斷

如:除法錯誤,單步執行,執行into指令,執行int n指令

外中斷:由外部裝置發生的事件引起的中斷

1)從中斷資訊中取得中斷型別碼n

2)pushf 標誌暫存器的值入棧–中斷過程中要改變標誌暫存器的值,需要先行保護

3)設定標誌暫存器的第八位tf和第九位if的值為0–tf:陷阱標誌,用於單步除錯;if:中斷標誌

4)push cs

5)push ip

6)從中斷向量表讀取中斷處理程式的入口位址,設定ip,cs

in: cpu從埠讀取資料

out: cpu往埠寫入資料

eg:提取cmos ram中儲存的時間資訊,在螢幕的左上角能動態顯示時間

該晶元內部有兩個埠,埠位址為70h和71h,cpu 通過這兩個埠讀寫cmos ram。

70h位址埠,存放要訪問的cmos ram單元的位址;

71h資料埠,存放從選定的單元中讀取的資料,或要寫入到其中的資料。

讀取cmos ram的兩個步驟

1)將要讀取的單元位址送入70h位址埠;

2)從資料埠71h讀出指定單元的內容

當前時間在cmos ram中用6個位元組存放

;分out

70h,al

in al,71h ;具體資料讀入到cpu

;分離十、個位

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b

add ah,30h ;轉換為ascii碼

add al,30h

mov bx,0b800h

mov es,bx

mov byte ptr es:[0],ah

mov byte ptr es:[1],01001111b

mov byte ptr es:[2],al

mov byte ptr es:[3],01001111b

mov byte ptr es:[4],':'

mov byte ptr es:[5],01001111b

mov al,0

;秒out

eg:編寫程式,模仿射擊遊戲中,用上、下、左、右鍵控制跳上、跳下、裝子彈、射擊的動作,esc鍵退出遊戲

assume cs:code, ss:stack, ds: data

stack segment

db 256 dup (0)

stack ends

data segment

dw 0,0

run db 'game is runing...',0dh,0ah,'$'

up db 'jump up...',0dh,0ah,'$'

down db 'jump down...',0dh,0ah,'$'

right db 'shoot...',0dh,0ah,'$'

left db 'get bullet...',0dh,0ah,'$'

over db 'byebye...',0dh,0ah,'$'

data ends

code segment

start:

;設定各段位址

mov ax,stack

mov ss,ax

mov sp,256

mov ax,data

mov ds,ax

mov ax,0

mov es,ax

;儲存原中斷例程入口位址

push es:[9

*4] pop ds:[0]

push es:[9

*4+2]

pop ds:[2]

;改變後中斷的入口位址

mov word ptr es:[9

*4],offset int9 ;ip

mov word ptr es:[9

*4+2],cs ;cs

;遊戲進行中

op_run:lea dx,run

call show

call delay

jmp op_run

;延時程式

delay:push ax

push dx

mov dx,10h

mov ax,0

s1:sub ax,1

sbb dx,0

cmp ax,0

jne s1

cmp dx,0

jne s1

pop dx

pop ax

ret;定義新的9號中斷

;呼叫原int9指令的中斷例程,模擬對原中斷例程的呼叫

int9:push ax

push bx

push es

in al,60h

pushf ;標誌暫存器入棧

;if,tf置為0

pushf

pop bx

and bh,11111100b

push bx

popf

call dword ptr ds:[0] ;呼叫原來的int9中斷例程,處理硬體細節

cmp al,1 ;esc

jne op_up

lea dx,over

call show

jmp finish

op_up: cmp al,72 ;up

jne op_down

lea dx,up

call show

op_down:cmp al,80 ;down

jne op_left

lea dx,down

call show

op_left:cmp al,75 ;left

jne op_right

lea dx,left

call show

op_right:cmp al,77 ;right

jne int9ret

lea dx,right

call show

int9ret:pop es

pop bx

pop ax

iret

int9_end:nop

;21號中斷的九號功能:輸出乙個字串

show:mov ah,09h

int21h ret

;恢復原來的int9中斷並退出

finish:push ds:[0]

pop es:[9

*4] push ds:[2]

pop es:[9

*4+2]

mov ax,4c00h

int21hcode ends

end start

WDM初步 埠讀寫

眾所周知,win2k 下使用者態程式不能操作硬體,所以要讀寫埠可以通過 wdm驅動來實現 對埠的讀寫可能是最簡單的驅動程式了,但通過這個程式可以大體了解一下 wdm工作流程,下面簡單介紹一下埠讀寫驅動程式的實現方法。我編制驅動的環境是 win2k sp4 win2k ddk driver studi...

C C Builder 下實現埠讀寫

c builder 下實現埠讀寫 自 計算機世界 文 魯軍張 張劍 本文介紹怎樣在c builder下實現埠讀寫,並舉出乙個具體例子。emit 函式介紹 emit 函式一般極少用到,通過使用c builder的help選單,可得到該函式的聯機幫助資訊。emit 函式用法為 void emit arg...

外部中斷與內部中斷

外部中斷與內部中斷 中斷基本概念 什麼是中斷?先打個比方。當乙個經理正處理檔案時,鈴響了 中斷請求 不得不在檔案上做乙個記號 返回位址 暫停工作,去接 中斷 並指示 按第二方案辦 調中斷服務程式 然後,再靜下心來 恢復中斷前狀態 接著處理檔案 計算機科學家觀察了類似例項,外師物化,內得心源 借用了這...