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:
saut relatif hors de portée par octets 000Eh. - RESOLU
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!
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
@rkhb Désolé, je ne comprends pas. Comment puis-je le faire? – Emil
@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. –