![]() |
#2
zklhp2012-07-06 09:17
|
然后住程序里面获取键盘的输入控制。
坏境是在虚拟机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 编辑 ]