《汇编实验(第三版)》王爽著 实验15 安装新的int 9中断例程

@[TOC](《汇编实验(第三版)》王爽著 实验15 安装新的int 9中断例程)

#  书本p285,实验项目:安装一个新的INT 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,如果松开,就显示满屏幕的“A”,其他的键照常处理。
## 分析

 1. 显示满屏幕的“A”
     结合课本P187实验9可知,显存的一页中可以显示80*25(2000)个字符,一个字符占两个字节的存储空间(一个字),低位为字符ASCⅡ值,高位为字符属性(闪烁、前、背景、高亮)。因此,要显示满屏幕的A,就要将字符‘A’写入显存对应的存储位置上。程序如下

 mov ax,0b800h
 mov es,ax 
 mov cx,2000 
 mov bx,0
 s3: mov byte ptr es:[bx],41h 
 inc byte ptr es:[bx+1]   ; 更改颜色 add bx,2 loop s3


2.其他部分参考书P282 15.5
3.完整程序如下:

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
	;初始化movsb相关寄存器
	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],0h
	sti
	
	mov ax,4c00h
	int 21h

int9:
	push es
	push cx
	push bx
	push ax
	in al,60h
	
	pushf
	call dword ptr cs:[200h]
	
	cmp al,9eh;A的通码为1eh,加上80h后为其断码
	jne int9ret
	
	mov ax,0b800h
	mov es,ax
	mov cx,2000
	mov bx,0
s3:	mov byte ptr es:[bx],41h
	inc byte ptr es:[bx+1]   ; 更改颜色
	add bx,2
	loop s3

	;mov bx,0
	;mov si,0
	;mov cx,25
;s1:	push cx
	;mov cx,80
	;mov al,'A'
;s0:	mov  es:[160*bx+si*2],al
	;inc si
	;loop s0
	;pop cx
	;inc bx
	;loop s1
	
	
int9ret:
	pop ax
	pop bx
	pop cx
	pop es
	iret
int9end: nop

code ends
end start

	
	
	
	

猜你喜欢

转载自blog.csdn.net/wenkang2261/article/details/90649395