|
发表于 2012-8-18 17:24:59
|
显示全部楼层
你的int0中断例程还是调用的是原来的系统的中断例程,当然显示不出来咯。
- mov byte ptr es:[12*160+40*2],'!'
- mov byte ptr es:[12*160+40*2+1],2
复制代码 把上面的语句写入int0中断例程才行啊。
我要下班吃饭去了,来不及和你细讲,给你两个源代码。
第一个是0号中断的安装程序。
- assume cs:code
- code segment
- start: mov ax,cs ;原地址
- mov ds,ax
- mov si,offset do0
- mov ax,0 ;目的地址
- mov es,ax
- mov di,200h
- mov cx,offset do0end - offset do0
- cld
- rep movsb
- mov word ptr es:[0],200h ;设置中断向量表
- mov word ptr es:[2],0
- mov ax,4c00h
- int 21h
- do0: jmp short do0start
- db 'welcome luke to masm!' ;这里可以改
- do0start:
- mov ax,cs ;设置ds:si指向字符串
- mov ds,ax
- mov si,202h
- mov ax,0b800h ;设置es:di显存
- mov es,ax
- mov di,12*160+36*2
- mov cx,21
- s: mov al,[si]
- mov ah,02h
- mov es:[di],ax
- inc si
- add di,2
- loop s
- mov ax,4c00h
- int 21h
- do0end:
- nop
- code ends
- end start
复制代码
第二个是测试0号中断是否被我们修改成我们想要显示的内容。
- assume cs:code
- code segment
- start: mov ax,1000h
- mov bh,1h
- div bh ;这里出现了除法溢出,系统自动调用int0号中断,其实已经被我们修改了
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
你把两个源码都编译一下,然后先运行第一个源码,安装覆盖掉原来的int0中断,然后运行第二个源码测试。
原理自己研究一下吧,我有空再来解释
|
|