|
1鱼币
- ;任务,一个新的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 环境
|
|