3楼的错误改了,程序还是有其他问题。求帮助,现在1CH中断的时候同时获取键盘输入,程序不能返回。
现在是新写了一个1CH时钟中断,用来刷新1行屏幕。然后住程序里面获取键盘的输入控制。
坏境是在虚拟机dos 6.22下
masm 5.0编译
如果在1CH里面只有一句iret,程序就没事。运行程序直接按q可以返回。
但是按了其他键之后 再按Q就程序返回不了,好像是卡主了 死机的样子
程序代码:
assume cs:code,ds:data,ss:stack stack segment stack db 128 dup(0) stack ends data segment ww db 160 dup('W') aa db 39 dup(' '),'A',40 dup(' ') data ends code segment start: call setbullet call install call getkey mov ax,0 mov es,ax push es:[200h] pop es:[1ch*4] push es:[202h] pop es:[1ch*4+2] mov ax,4c00h int 21h install: ;install 1ch to refresh screen push ax push es push di push ds push si push cx mov ax,0 mov es,ax mov di,210h mov ax,cs mov ds,ax mov si,offset refresh mov cx,offset refreshend-offset refresh cld rep movsb mov ax,0 mov es,ax push es:[1ch*4] pop es:[200h] push es:[1ch*4+2] pop es:[202h] cli mov word ptr es:[1ch*4],210h mov word ptr es:[1ch*4+2],0 sti pop cx pop si pop ds pop di pop es pop ax ret getkey: ;get a key push ax mov ah,0 int 16h cmp ah,4bh je leftkey cmp ah,4dh je rightkey cmp ah,39h je spacekey cmp ah,10h je quit jmp getkey leftkey: jmp getkey rightkey: jmp getkey spacekey: jmp getkey quit: pop ax ret setbullet: ;set bullets push ax push es push si push cx mov ax,0 mov es,ax mov si,2a0h mov cx,80 ssetbul: mov al,'.' mov es:[si],al inc si loop ssetbul pop cx pop si pop es pop ax ret refresh: ;sub refresh screen, new 1ch int push ax push es push si push bx push cx push ds mov ax,0b800h mov es,ax mov ax,0 mov ds,ax mov si,2a0h mov bx,160*2 mov cx,80 sref: mov al,ds:[si] mov es:[bx],al inc si add bx,2 loop sref pop ds pop cx pop bx pop si pop es pop ax iret refreshend: nop code ends end start
[ 本帖最后由 cdangjia 于 2012-7-6 23:38 编辑 ]