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