標籤:des os ar art ad 學習 sp table
外中斷是指那些不再CPU內部產生的中斷,即通過連接埠與cpu通訊的外設產生的中斷。
- 可屏蔽中斷是CPU可以不響應的外中斷
- 不可屏蔽中斷是CPU必須響應的中斷,其中斷類型碼都是2
- sti,cli可以屏蔽中斷,讓一些如改變中斷向量的操作安全進行。
1. 可屏蔽中斷,CPU根據標誌寄存器IF位決定是否響應中斷,IF=1,響應中斷,IF=0,不響應中斷。
sti,用於設定IF=1;
cli,用於設定IF=0。
2. 不可屏蔽中斷,CPU必須響應中斷。不可屏蔽中斷的中斷類型碼固定為2,所以中斷過程中,不需要取中斷類型碼。則不可屏蔽中斷的中斷過程為:
(1)標誌寄存器入棧,IF=0,TF=0;
(2)CS、IP入棧;
(3)(IP)=(8),(CS)=(0AH)。
程式1:在螢幕中某個位置一次輸出A~Z,按ESC改變該位置顏色,每個電腦執行速度可能不一樣,延時可以適當修改。
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]
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
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]
mov ax,4c00h
int 21h
delay:
push ax
push dx
mov dx,10h
mov ax,0
s1:
sub ax,1 ;sbb帶借位減法指令0-1=ffff,CF=1
sbb dx,0 ;(dx)=(dx)-0-CF
cmp ax,0 ;相當於ffff*1000次
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
int9: push ax
push bx
push es
in al,60h
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[0]
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1] ;將屬性值加一改變顏色
int9ret:pop es
pop bx
pop ax
iret
code ends
end start
程式2:按f1改變螢幕顯示顏色。
;cs總在高地址處
assume cs : codesg, ss : stacksg
stacksg segment
dw 64 dup (0)
stacksg ends
codesg segment
start: mov ax, stacksg
mov ss, ax
mov sp, 128
mov ax, 0
mov es, ax
mov ax, codesg
mov ds, ax
mov si, offset int9s
mov di, 0200h
cli
mov bx, offset table
mov ax, es : [9 * 4]
mov [bx], ax
mov ax, es : [9 * 4 + 2]
mov [bx + 2], ax
mov word ptr es : [9 * 4], 0200h
mov word ptr es : [9 * 4 + 2], 0
sti
mov cx, offset int9end - offset int9s
cld
rep movsb
mov ax, 4c00h
int 21h
int9s: jmp short sss
table dw 0, 0
sss: push ds
push ax
push cx
push si
pushf
mov ax, 0
mov ds, ax
call dword ptr ds : [202h]
in al, 60h
cmp al, 3bh
jne int9ret
mov si, 0
mov cx, 2000
mov ax, 0b800h
mov ds, ax
s1: inc byte ptr [si + 1]
add si, 2
loop s1
int9ret: pop si
pop cx
pop ax
pop ds
iret
int9end: nop
codesg ends
end start
程式3:在DOS下,按下‘A‘鍵後,鬆開就顯示滿螢幕‘A’。
;中斷時的入棧順序是pushf,push cs, push ip
assume cs : codesg, ss : stacksg
stacksg segment
dw 64 dup (0)
stacksg ends
codesg segment
start: mov ax, stacksg
mov ss, ax
mov sp, 128
mov ax, 0
mov es, ax
mov di, 0200h
mov si, offset int9
push cs
pop ds
cli
mov bx, offset table
mov ax, es : [9 * 4]
mov ds : [bx], ax
mov ax, es : [9 * 4 + 2]
mov ds : [bx + 2], ax
sti
mov cx, offset int9end - offset int9
cld
rep movsb
mov word ptr es : [9 * 4 + 2], 0
mov word ptr es : [9 * 4], 0200h
mov ax, 4c00h
int 21h
int9: jmp short s
table dw 0, 0
s: push ax
push cx
push si
push es
mov ax, 0
mov ds, ax
pushf
call dword ptr ds : [202h]
in al, 60h
cmp al, 9eh
jne int9ret
mov ax, 0b800h
mov es, ax
mov si, 0
mov cx, 2000
s1: mov byte ptr es : [si], ‘A‘
add si, 2
loop s1
int9ret:pop es
pop si
pop cx
pop ax
iret
int9end:nop
codesg ends
end start