pc 系統(tǒng)的接口卡和主板上,裝有各種接口芯片。這些外設(shè)接口芯片內(nèi)部有若干寄存器,cpu將這些寄存器當(dāng)作端口來訪問。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、呼圖壁ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的呼圖壁網(wǎng)站制作公司cpu通過端口和外部設(shè)備進(jìn)行聯(lián)系。
15.2 外中斷信息來自外部的中斷信息
外部中斷原有兩類:
第一類:可屏蔽中斷源cpu是否響應(yīng)中斷要看標(biāo)志寄存器。if=1的話,執(zhí)行完當(dāng)前指令后去響應(yīng)中斷。if=0的話,不響應(yīng)中斷。
內(nèi)中斷的過程:
(1)取中斷類型碼n
(2)標(biāo)志寄存器入棧,if=0,tf=0
(3)cs、ip入棧
(4)(ip)=(n*4),(cs)=(n*4+2)
if=0就是為了屏蔽其他的可屏蔽中斷
指令:
sti ;if=1
cli ;if=0
第二類:不可屏蔽中斷cpu必須響應(yīng)。
8086cpu不可屏蔽終端類型碼固定為2,所以屏蔽過程中不需要取中斷類型碼。
過程:
(1)標(biāo)志寄存器入棧,if=0,tf=0
(2)cs ip入棧
(3)(ip)=(8),(cs)=(0ah)
15.3pc鍵盤的處理過程鍵盤中每個(gè)按鍵相當(dāng)于一個(gè)開關(guān),鍵盤中有一個(gè)芯片對(duì)鍵盤上的每一個(gè)鍵的開關(guān)狀態(tài)進(jìn)行掃描。
按下一個(gè)鍵時(shí),開關(guān)接通,芯片會(huì)產(chǎn)生一個(gè)掃描碼,掃描碼說明了按下的鍵在鍵盤上的位置。掃描碼被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口地址為60h
松開按下的鍵時(shí),也會(huì)產(chǎn)生一個(gè)掃描碼,掃描碼說明了松開的鍵在鍵盤上的位置,松開按鍵時(shí)產(chǎn)生的掃描碼也會(huì)被送入60h端口中。
一般按下鍵盤時(shí)的掃描碼被叫做通碼,松開時(shí)的掃描碼叫做斷碼。掃描碼長度為一個(gè)字節(jié),通碼第7位為0,斷碼第七位為1
就是:
斷碼=通碼+80h
鍵盤的輸入到達(dá)60h端口時(shí),相關(guān)的芯片就會(huì)向cpu發(fā)出中斷類型碼為9的可屏蔽中斷信息。
cpu檢測(cè)到該中斷信息后,如果if=1,則響應(yīng)中斷,引發(fā)中斷過程,轉(zhuǎn)去執(zhí)行int9中斷例程
(BIOS)系統(tǒng)板的ROM(只讀內(nèi)存)中放有一套程序,稱為BIOS(基本輸出輸入系統(tǒng))
BIOS提供了int9 的中斷例程,用來進(jìn)行鍵盤的讀取和輸出。
:(1)讀出60h端口中的掃描碼
(2)如果是字符鍵的掃描碼,將該掃描碼和它所對(duì)應(yīng)的字符碼(ascll)送入內(nèi)存(一個(gè)字節(jié)加一個(gè)字節(jié)=一個(gè)字),=中的BIOS鍵盤緩沖區(qū),如果是控制鍵的掃描碼,則將其轉(zhuǎn)化成狀態(tài)字節(jié)(用二進(jìn)制記錄控制鍵和切換鍵狀態(tài)字節(jié))寫入內(nèi)存中儲(chǔ)存狀態(tài)字節(jié)的單元(內(nèi)存單元)。
(3)對(duì)鍵盤系統(tǒng)進(jìn)行相關(guān)的控制,比如像向芯片發(fā)出應(yīng)答信息
BIOS鍵盤換緩沖區(qū)是系統(tǒng)啟動(dòng)后,BIOS用于存放int9 中斷例程所接受的鍵盤輸入的內(nèi)存區(qū)。該內(nèi)存區(qū)可以存儲(chǔ)15個(gè)鍵盤輸入(15個(gè)字型數(shù)據(jù)),因?yàn)閕nt9 中斷例程除了接收掃描碼外還要產(chǎn)生掃描碼對(duì)應(yīng)的字符碼,所以在BIOS鍵盤緩沖區(qū)中,一個(gè)鍵盤輸入用一個(gè)字單元存放,高位存放掃描碼,低位存放字符碼(ascll)。
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
call init_reg
call show_keywordstatus
mov ax,4C00h
int 21h
;===============================
init_reg: mov bx,0B800h
mov es,bx
mov bx,40h
mov ds,bx
ret
;====================================
show_status: push cx
push dx
push ds
push es
push si
push di
mov cx,8
showstatus: mov dx,0
shl al,1
adc dx,30h
mov es:[di],dl
add di,2
loop showstatus
pop di
pop si
pop es
pop ds
pop dx
pop cx
ret
;===========================
show_keywordstatus:
mov si,17h
testA:
mov di,160*10+40*2
mov al,ds:[si]
call show_status
jmp testA
ret
code ends
end start
15.4 編寫int9中斷例程鍵盤的輸入處理過程:
鍵盤產(chǎn)生掃描碼
掃描碼送入60h端口
引發(fā)9號(hào)中斷
cpu執(zhí)行int9中斷例程處理鍵盤輸入
編程:在屏幕中依次顯示'a'~'z' esc后改變顏色。
由于cpu執(zhí)行速度太快,所以要在每一次輸入后都進(jìn)行好多次循環(huán)來延遲時(shí)間。
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
mov ax,0b800h
mov es,ax
mov ah,'a'
s: mov es:[160*12+40*2],ah
call delay
inc ah
cmp ah,'z'
jna s
mov ax,4c00h
int 21h
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
code ends
end start
改變顏色
那個(gè)咱就是說代碼一定不要放到vscode的安裝目錄中
assume cs:code
stack segment
db 128 dup (0)
stack ends
data segment
dw 0,0
data ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
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] ;將原來的int9中斷例程,的入口保存在ds:0、ds:2中
cli
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs ;在中斷向量表中設(shè)置新的int9 中斷例程的入口地址
sti
mov ax,0b800h
mov es,ax
mov ah,'a'
s: mov es:[160*12+40*2],ah
call delay
inc ah
cmp ah,'z'
jna s
mov ax,0
mov es,ax
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2] ;將中斷向量表中int9中斷例程的入口恢復(fù)為原來的地址
mov ax,4c00h
int 21h
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
;======================================
int9: push ax
push bx
push es
in al,60h ;從端口60h讀取鍵盤的輸入數(shù)據(jù)
;原來的int調(diào)用是(取中斷碼類型)->(標(biāo)志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
;我們將地址放到ds中,所以第一步可省,那么就剩(標(biāo)志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
;(cs、ip入棧)->(ip=n*4,cs=n*4+2)==call dword ptr ds:[0]
;那么就剩(標(biāo)志寄存器入棧)->(if=0,tf=0)->call dword ptr ds:[0]三步
;
;
pushf ;標(biāo)志寄存器入棧
; pushf
; pop bx
; and bh,11111100b ;標(biāo)志寄存器if=tf=0
; push bx
; popf
call dword ptr ds:[0] ;模擬int指令,調(diào)用原來的int9中斷例程
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1] ;屬性值加1改變顏色
int9ret:pop es
pop bx
pop ax
iret
code ends
end start
15.5安裝新的int9中斷例程序按下F1后屏幕顏色改變
大概思路就是先將自己寫好的int9機(jī)器碼復(fù)制粘貼到0:204
需要先將老int9的csip存到0:200
然后改變中斷信息表int9為新的int9的csip
新的int9中會(huì)使用call調(diào)用老的int9
然后進(jìn)行判斷如果是某個(gè)鍵就進(jìn)行啥啥
其實(shí)就是在原來的int9前邊加了一點(diǎn)東西
assume cs:code
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
mov ax,4C00h
int 21h
int9: push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,3bh
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s: inc byte ptr es:[bx]
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
實(shí)驗(yàn)15 安裝新的int9中斷例程按下“A”后除非不松開,只要松開就出現(xiàn)滿屏的"A"
直接根據(jù)前邊那個(gè)改的
先將老int9挪到一邊,在新得int9中用call調(diào)用老int9
新的int9可以在調(diào)用之后加一些功能
assume cs:code
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
mov ax,4C00h
int 21h
int9: push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,1eh+80h
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱:匯編語言第十五章外中斷小白筆記-創(chuàng)新互聯(lián)
瀏覽地址:http://bm7419.com/article30/didspo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、定制網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、企業(yè)建站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容