pc 系統的接口卡和主板上,裝有各種接口芯片。這些外設接口芯片內部有若干寄存器,cpu將這些寄存器當作端口來訪問。
我們提供的服務有:成都網站設計、網站制作、外貿營銷網站建設、微信公眾號開發、網站優化、網站認證、呼圖壁ssl等。為1000+企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的呼圖壁網站制作公司cpu通過端口和外部設備進行聯系。
15.2 外中斷信息來自外部的中斷信息
外部中斷原有兩類:
第一類:可屏蔽中斷源cpu是否響應中斷要看標志寄存器。if=1的話,執行完當前指令后去響應中斷。if=0的話,不響應中斷。
內中斷的過程:
(1)取中斷類型碼n
(2)標志寄存器入棧,if=0,tf=0
(3)cs、ip入棧
(4)(ip)=(n*4),(cs)=(n*4+2)
if=0就是為了屏蔽其他的可屏蔽中斷
指令:
sti ;if=1
cli ;if=0
第二類:不可屏蔽中斷cpu必須響應。
8086cpu不可屏蔽終端類型碼固定為2,所以屏蔽過程中不需要取中斷類型碼。
過程:
(1)標志寄存器入棧,if=0,tf=0
(2)cs ip入棧
(3)(ip)=(8),(cs)=(0ah)
15.3pc鍵盤的處理過程鍵盤中每個按鍵相當于一個開關,鍵盤中有一個芯片對鍵盤上的每一個鍵的開關狀態進行掃描。
按下一個鍵時,開關接通,芯片會產生一個掃描碼,掃描碼說明了按下的鍵在鍵盤上的位置。掃描碼被送入主板上的相關接口芯片的寄存器中,該寄存器的端口地址為60h
松開按下的鍵時,也會產生一個掃描碼,掃描碼說明了松開的鍵在鍵盤上的位置,松開按鍵時產生的掃描碼也會被送入60h端口中。
一般按下鍵盤時的掃描碼被叫做通碼,松開時的掃描碼叫做斷碼。掃描碼長度為一個字節,通碼第7位為0,斷碼第七位為1
就是:
斷碼=通碼+80h
鍵盤的輸入到達60h端口時,相關的芯片就會向cpu發出中斷類型碼為9的可屏蔽中斷信息。
cpu檢測到該中斷信息后,如果if=1,則響應中斷,引發中斷過程,轉去執行int9中斷例程
(BIOS)系統板的ROM(只讀內存)中放有一套程序,稱為BIOS(基本輸出輸入系統)
BIOS提供了int9 的中斷例程,用來進行鍵盤的讀取和輸出。
:(1)讀出60h端口中的掃描碼
(2)如果是字符鍵的掃描碼,將該掃描碼和它所對應的字符碼(ascll)送入內存(一個字節加一個字節=一個字),=中的BIOS鍵盤緩沖區,如果是控制鍵的掃描碼,則將其轉化成狀態字節(用二進制記錄控制鍵和切換鍵狀態字節)寫入內存中儲存狀態字節的單元(內存單元)。
(3)對鍵盤系統進行相關的控制,比如像向芯片發出應答信息
BIOS鍵盤換緩沖區是系統啟動后,BIOS用于存放int9 中斷例程所接受的鍵盤輸入的內存區。該內存區可以存儲15個鍵盤輸入(15個字型數據),因為int9 中斷例程除了接收掃描碼外還要產生掃描碼對應的字符碼,所以在BIOS鍵盤緩沖區中,一個鍵盤輸入用一個字單元存放,高位存放掃描碼,低位存放字符碼(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中斷例程鍵盤的輸入處理過程:
鍵盤產生掃描碼
掃描碼送入60h端口
引發9號中斷
cpu執行int9中斷例程處理鍵盤輸入
編程:在屏幕中依次顯示'a'~'z' esc后改變顏色。
由于cpu執行速度太快,所以要在每一次輸入后都進行好多次循環來延遲時間。
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
改變顏色
那個咱就是說代碼一定不要放到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 ;在中斷向量表中設置新的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中斷例程的入口恢復為原來的地址
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讀取鍵盤的輸入數據
;原來的int調用是(取中斷碼類型)->(標志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
;我們將地址放到ds中,所以第一步可省,那么就剩(標志寄存器入棧)->(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]
;那么就剩(標志寄存器入棧)->(if=0,tf=0)->call dword ptr ds:[0]三步
;
;
pushf ;標志寄存器入棧
; pushf
; pop bx
; and bh,11111100b ;標志寄存器if=tf=0
; push bx
; popf
call dword ptr ds:[0] ;模擬int指令,調用原來的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機器碼復制粘貼到0:204
需要先將老int9的csip存到0:200
然后改變中斷信息表int9為新的int9的csip
新的int9中會使用call調用老的int9
然后進行判斷如果是某個鍵就進行啥啥
其實就是在原來的int9前邊加了一點東西
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
實驗15 安裝新的int9中斷例程按下“A”后除非不松開,只要松開就出現滿屏的"A"
直接根據前邊那個改的
先將老int9挪到一邊,在新得int9中用call調用老int9
新的int9可以在調用之后加一些功能
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
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站名稱:匯編語言第十五章外中斷小白筆記-創新互聯
瀏覽地址:http://vcdvsql.cn/article30/didspo.html
成都網站建設公司_創新互聯,為您提供用戶體驗、定制網站、網頁設計公司、品牌網站建設、企業建站、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯