;任务,一个新的9号中断处理例程,按F1改变颜色,其它键无变化
assume cs:code , ds:data , ss:stack
stack segment
db 128 dup ('0')
stack ends
data segment
db 128 dup('0')
data ends
code segment
start:
;0.段初始化
mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
;3.将程序安装到内存
push cs
pop ds
mov si,offset bk9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset bk9end - offset bk9
cld
rep movsb
;1.先保存原9号中断例程入口,不能存到本程序中,可指定到某内存位置
mov ax,0
mov es,ax
push es:[9h*4+2]
pop es:[202h]
push es:[9h*4]
pop es:[200h]
;2.改写入口地址
cli
mov word ptr es:[9*4+2] , 0
mov word ptr es:[9*4],204h
sti
;4.程序结束
mov ax,4c00h
int 21h
;----以下是中断处理程序-----
bk9:
push ax
push bx
push cx
push es
;1.读取60号端口
in al,60h
pushf ;模拟原9号中断时,注意pushf位置
;2.执行原9号中断,注意位置
;下三句错误
;mov bx,0
;mov es,bx
;call dword ptr es:[200h]
call dword ptr cs:[200h]
;3.新加的处理
cmp al,3bh
jne bk9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s1: add byte ptr es:[bx],1
add bx,2
loop s1
bk9ret:
pop es
pop cx
pop bx
pop ax
iret
bk9end:nop
;----以上是中断处理程序-----
code ends
end start
一、按下图移动代码位置后,程序能编译不能运行。
二、按下图白框的写法,能编译不能运行。
请教各位,为什么会这样? 我用的虚拟机 dos7 环境
|