【中断程序】int 9中断例程

image

思路:
(1)编写子程序连续显示a~z
(2)显示一个字符后,让字符停留几秒再显示下一个字符
(3)不安装int 9中断例程,而是直接修改向量表。(修改int 9向量表前要设置IF=0,修改后要设置IF=1)
(4)在修改向量表之前要保存原有int 9例程的地址
(5)在自定义的中断例程中,需要调用BIOS的int 9,为此必须手动模拟硬件过程

assume cs:code

stack segment

	db 16 dup(0)

stack ends

data segment

	dw 0,0

data ends

code segment

start:
	mov ax,stack
	mov ss,ax
	mov sp,16

	mov ax,0
	mov es,ax

	mov ax,data
	mov ds,ax

	push es:[9*4]
	pop ds:[0]
	push es:[9*4+2]
	pop ds:[2]

	cli
	mov word ptr es:[9*4],offset int9
	mov word ptr es:[9*4+2],cs
	sti

	call show

	cli
	push ds:[0]
	pop es:[9*4]
	push ds:[2]
	pop es:[9*4+2]
	sti

	mov ax,4c00h
	int 21h

show:
	push ax
	push es	
	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
	pop es
	pop ax
	ret

; 通过多次的减法运算实现等待几秒的效果
delay:
	push dx
	push ax
	mov dx,10h
	mov ax,0
dsub:
	sub ax,1
	sbb dx,0
	cmp dx,0
	jne dsub
	cmp ax,0
	jne dsub
	pop ax
	pop dx
	ret

;----------------------------

int9:
	push ax
	push es
	in al,60h
	
	; 手动模拟硬件过程,IF、TF已经为0,不再设置
	pushf
	call dword ptr ds:[0] ; BIOS的int 9结束时会iret,因此需要手动pushf
	
	cmp al,1
	jne int9_ret
	mov ax,0b800h
	mov es,ax
	inc byte ptr es:[160*12+40*2+1]
int9_ret:
	pop es
	pop ax
	iret

code ends

end start
posted @ 2022-06-08 19:31  moon_orange  阅读(205)  评论(0编辑  收藏  举报