assume cs:code
data segment
dw 8 dup (0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
;保存旧9号中断例程的入口地址
mov ax, data
mov ds, ax
mov si, 0
mov ax, 0
mov es, ax
mov ax, es:[9h*4]
mov [si], ax
mov ax, es:[9h*4+2]
mov [si+2], ax
;填充新9号中断例程的入口地址
cli ;解答了第二小题。
mov word ptr es:[9h*4], offset int9
mov word ptr es:[9h*4+2], cs
sti ;解答了第二小题。
mov ax, 0b800h
mov es, ax
mov ah, 'A'
s:
mov es:[160*12+40*2], ah
call delay
inc ah
cmp ah, 'Z'
jna s
;还原旧9号中断例程的入口地址,保证程序退出后,系统的正常键盘处理。
cli ;解答了第二小题。
mov ax, [si]
mov es:[9h*4], ax
mov ax, [si+2]
mov es:[9h*4+2], ax
sti ;解答了第二小题。
mov ax, 4c00h
int 21h
delay:
push ax
push dx
mov bx, 0h
mov ax, 0h
delay1:
sub ax, 1
sbb dx, 1
cmp ax, 0
jne delay1
cmp dx, 0
jne delay1
pop dx
pop ax
ret
int9:
push ax
push es
;调用旧9号中断例程
;1 标志寄存器入栈
pushf
;设置标志寄存器中的IF=0, TF=0;此时已在中断例程中,无须再设置IF和TF位了. 解答了第一小题。
;pushf
;pop ax
;and ah, 11111100b
;push ax
;popf
;CS,IP入栈 调用中断例程
call dword ptr ds:[0]
in al, 60h
cmp al, 1h
jne int90
;ESC键按下,则
mov ax, 0b800h
mov es, ax
inc byte ptr es:[160*12+40*2+1]
int90:
pop es
pop ax
iret
code ends
end start
- [qiangzi] 楼主有空的话能帮我装一下dos吗?我一直装不上,qq519710391,先谢谢! 02/06 20:34
- [zwz_good] 看到自己的注释能给别人带来帮助,心里非常高兴,也许这就是帮助别人的快乐吧。 10/20 16:23
- [游客] 程序测试了一下,没什么问题。 10/20 14:25
- [游客] 博主程序中的那部分注释说明非常重要,非常有用,非常有帮助。好啊。 10/20 14:15
- [zwz_good] 谢谢你的鼓励。 10/10 20:56
- [游客] 自己实现更能体会过程,有好处,做完了再做便捷的就知道便捷在哪了。 顶博主! 10/10 14:25
- [zwz_good] 噢,习惯了使用这个子程序了,再来一个使用INT 21H中断的,谢谢提醒。 10/09 20:25
- [tinyparticle] ;名称:show_str 显示字符串子程序 ;功能:在指定的位置,用指定的颜色,显示一个用0 10/09 20:17
- [tinyparticle] 同意楼上 10/08 22:56
- [20081148] 你的7ch中断例程有问题,题目要求实现无条件段内近转移 jmp near ptr s指令,可你的代码 10/08 22:24
- [20081148] 你的虚拟机从哪下的啊?我下了好几个,都不能用,无语了。 10/21 08:53