2017-04-15 115 views
2

这是代码:移动用箭头键的像素在组件

IDEAL 
MODEL small 
STACK 100h 
DATASEG 
; -------------------------- 
key db 0 
locH dw 0 ;location horizontal 
locV dw 0 ;location vertical 
; -------------------------- 
CODESEG 

UP_ON equ 48h 
UP_OFF equ 0c8h 
DOWN_ON equ 50h 
DOWN_OFF equ 0d0h 
LEFT_ON equ 4Bh 
LEFT_OFF equ 0cBh 
RIGHT_ON equ 4Dh 
RIGHT_OFF equ 0cDh 
ESCAPE equ 1 

proc getKey 
in al, 60h 
mov [key],al 
ret 
endp getKey 

start: 
    mov ax, @data 
    mov ds, ax 
; -------------------------- 
;fullscreen 
MOV AL, 13H 
MOV AH, 0 
INT 10H 
;print red pixel 
MOV AH,0Ch 
MOV AL,4 
MOV CX,160 ; 0 ≤ X ≤ 319 
MOV DX,100 ; 0 ≤ Y ≤ 199 
INT 10H 
mov [locH],cx 
mov [locV],dx 

mainLoop: 
call getKey 
cmp [key],ESCAPE 
jne next 
jmp exit 
next: 
;checks if key is up 
cmp [key],UP_ON 
je up 
;checks if key is down 
cmp [key],DOWN_ON 
je down 
;checks if key is left 
cmp [key],LEFT_ON 
je left 
;checks if key is right 
cmp [key],RIGHT_ON 
jne next2 
jmp right 
next2: 
jmp mainLoop 
; --------------------------  

exit: 
;exits full screen mode 
MOV AL, 3H 
MOV AH, 0 
INT 10H 
mov ax, 4c00h 
int 21h 

up: 
;delete previous red pixel 
MOV AH,0Ch 
MOV AL,0 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 
inc [locV] 
;print next red pixel 
MOV AH,0Ch 
MOV AL,4 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 

mov [locH],cx 
mov [locV],dx 

jmp mainLoop 



down: 
;delete previous red pixel 
MOV AH,0Ch 
MOV AL,0 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 
dec [locV] 
;print next red pixel 
MOV AH,0Ch 
MOV AL,4 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 

mov [locH],cx 
mov [locV],dx 



left: 
;delete previous red pixel 
MOV AH,0Ch 
MOV AL,0 
MOV CX,[locH]; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 
dec [locH] 
;print next red pixel 
MOV AH,0Ch 
MOV AL,4 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 

mov [locH],cx 
mov [locV],dx 


right: 
;delete previous red pixel 
MOV AH,0Ch 
MOV AL,0 
MOV CX,[locH]; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 
inc [locH] 
;print next red pixel 
MOV AH,0Ch 
MOV AL,4 
MOV CX,[locH] ; 0 ≤ X ≤ 319 
MOV DX,[locV] ; 0 ≤ Y ≤ 199 
INT 10H 

mov [locH],cx 
mov [locV],dx 
jmp mainLoop 



END start 

似乎有两个问题中的代码:通过000EH字节

  1. 相对跳转超出范围。 - 求解

  2. 该代码无法正常工作。当我按下一个箭头键时,像素会出现异常并移动到屏幕上的其他位置。 我不知道为什么有问题,我尝试了所有我能想到的事情。

感谢您的帮助!

+0

对于第一个问题的指令'JUMPS'添加到源代码开始。 TASM将自动改变两个正确跳转序列中的错误跳转(一个相对和一个绝对跳转)。 – rkhb

+0

@rkhb对不起,我不明白。我该怎么做? – Emil

+0

@Emil - 超出范围跳跃的解决方案是将'je exit'更改为更长的序列'jne next/jmp exit/next:'。显然TASM可以为你做到这一点,如果你问它。 –

回答

1

既然你留下了你的第二个问题,以下是有关当前程序的一些看法:

  • 你不应该通过直接读取一些键盘端口了解按键。更好地利用相应的BIOS功能:

    proc getKey 
        mov ah, 00h 
        int 10h 
        mov [key],al 
        ret 
    endp getKey 
    
  • 当用户按下UP关键,他将期待的红点在屏幕上向上移动。由于屏幕的坐标系与通常的数学XY坐标系不同,因此您需要例行程序中的例程和inc [locV]例程中的例行程序中的dec [locV]
    离开程序是正确的。

  • 一个原因BIOS调用可能会失败,是不是提供所有参数时! BIOS调用绘制BH寄存器中显示页面的像素。你应该设置这个零:

    mov bh, 0 ;Display page