2017-04-15 3 views
2

Voici le code:Déplacer un pixel avec les touches fléchées dans l'assemblage

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 

Il semble qu'il y ait deux problèmes dans le code:

  1. saut relatif hors de portée par octets 000Eh. - RESOLU

  2. Le code ne fonctionne pas correctement. Lorsque j'appuie sur une touche fléchée, le pixel panique et se déplace à un endroit différent à l'écran. Je ne sais pas pourquoi il y a des problèmes et j'ai essayé tout ce que je pouvais penser.

Merci de votre aide!

+0

Pour le premier numéro ajouter la directive 'JUMPS' au début de la source. TASM changera automagiquement le mauvais saut dans une séquence de deux sauts corrects (un relatif et un absolu). – rkhb

+0

@rkhb Désolé, je ne comprends pas. Comment puis-je le faire? – Emil

+0

@Emil - La solution pour un saut hors plage est de changer, par exemple, 'je exit' en une séquence plus longue' jne next/jmp exit/next: '. Apparemment, TASM peut le faire pour vous, si vous le demandez. –

Répondre

1

Puisque vous êtes de gauche avec votre deuxième problème, voici quelques observations au sujet du programme actuel:

  • Vous ne devriez pas découvrir en lisant directement les pressions de touche un port du clavier. Mieux utiliser la fonction du BIOS approprié:

    proc getKey 
        mov ah, 00h 
        int 10h 
        mov [key],al 
        ret 
    endp getKey 
    
  • Lorsque l'utilisateur appuie sur la UP touche, il attend le point rouge de se déplacer vers le haut sur l'écran. Puisque le système de coordonnées pour l'écran est différent du système mathématique XY habituel, vous devez dec [locV] dans la routine jusqu'à et inc [locV] dans la routine vers le bas.
    Vos routines gauche et droite sont corrects.

  • Une raison pour laquelle les appels BIOS peuvent échouer est lorsque tous les arguments ne sont pas fournis! Les appels BIOS pour tracer un pixel attendent la page d'affichage dans le registre BH. Vous devez définir cette valeur à zéro:

    mov bh, 0 ;Display page