汇编语言(第3版)实验15安装新的int 9中断例程

assume cs:code
stack segment
	db 128 dup (0)
stack ends
code segment
start:
	mov ax,stack
	mov ss,ax
	mov sp,128

	push cs
	pop ds    ;设置ds==cs

	mov ax,0
	mov es,ax  ;设置目标段地址为0

	mov si,offset int9   ;源地址 为本安装程序的cs:si
	mov di,204h	;新例程的安装地址
	mov cx,offset int9end-offset int9  ;新例程的大小
	cld	;正向传送
	rep movsb
	
	push es:[9*4]	
	pop es:[200h]	;保存原int9例程的偏移地址到0:200单元

	push es:[9*4+2]
	pop es:[202h]	;保存原int9例程的段地址到0:202单元

	cli	;屏蔽了可屏蔽中断
	mov word  ptr es:[9*4],204h	
	mov word ptr es:[9*4+2],0	;设置现在的int9中断向量表
	sti	;接收可屏蔽中断
	
	mov ax,4c00h
	int 21h	
int9:
	jmp intStart
pressedFlag:	db 0	;a按下就将这个标志设置为1,松开就设置为0,默认为0
intStart:
	push ax

	push cx
	push es
	push di
	
	in al,60h
	
	pushf
	call dword ptr cs:[200h]	;调用原int9例程 

	cmp al,1Eh	
	je setFlag	;是A按下了
	
	cmp al,9Eh	
	jne intExit
			;是A松开了
	
	mov ax,offset pressedFlag
	mov ds,ax
	cmp byte ptr ds:[0],1
	jne intExit
	;以前被按下过,标志为1
	;满屏A
	mov ax,0b800h
	mov es,ax
	mov di,0
	mov cx,2000
intS:
	mov byte ptr es:[di],41h
	add di,2
	loop intS
	;设置标志为0
	mov byte ptr ds:[0],0
	
intExit:
	pop di
	pop es
	pop cx
	pop ax
	iret

setFlag:
	;设置标志为1
	mov ax,offset pressedFlag
	mov ds,ax
	mov byte ptr ds:[0],1
	jmp intExit	

int9end:
	nop


code ends
end start

猜你喜欢

转载自blog.csdn.net/duling2/article/details/84350180