Probleme affichage cadre

jo_benni Messages postés 4 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 18 février 2005 - 10 févr. 2005 à 15:36
jo_benni Messages postés 4 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 18 février 2005 - 11 févr. 2005 à 14:15
Salut à tous, voilà je débute en assembleur et j'ai fait un petit programme exe qui affiche une succession de cadre de plus en plus grand. Le probleme c que lorsque la longueur d'un côté du carré dépasse 255, ca affiche n'importe quoi ! j'ai essayé de parer à ce problème mais sans succès. Je vous laisse juger par vous-même. Si quelqu'un pouvais résoudre ce problème, ca serai cool!

Merci

ps : j'utilise tasm

-------------------------------------------------------

.386


code segment use16


assume cs:code, ds:data, ss:pile



debut:


mov ax, data
mov ds, ax


;passage au mode video (640x480)
mov ah, 00h
mov al, 12h
int 10h


mov ax, 0
push ax


répétition_cadre:

pop ax
push ax
sub x1, ax
sub y1, ax

mov dl, 2
mul dl
add word ptr ds:[longueur], ax


push x1 y1 0 2 ;dessine un carré (x, y, orientation, couleur)
call dessine

push x1 y1 1 2
call dessine

pop ax
push ax
add y2, ax
push x1 y2 0 2
call dessine


pop ax
push ax
add x3, ax
sub y3, ax
push x3 y3 1 2
call dessine

add compteur, 01d

pop ax
push ax
cmp ax, 0
jne ajout_pas_5

pop ax
add ax, 5
push ax

ajout_pas_5:
cmp compteur, 26
jne répétition_cadre


;attente frappe touche
frappe:
mov ah, 01h
int 16h ;vérifie le buffer pour voir si une touche du clavier a été enfoncée
je frappe ;si buffer vide, on attend une frappe
mov ah, 00h ;sinon on vide le buffer
int 16h


;retour au mode text
mov ah, 00h
mov al, 00h
int 10h


;arrêt programme
mov ah, 4ch
int 21h





dessine proc near
;sauvegarde adresse début pile
mov bp, sp


mov ah, 0ch
mov al, ss:[bp+2] ;couleur
mov cx, ss:[bp+8] ;x
mov dx, ss:[bp+6] ;y
int 10h

mov bl, ss:[bp+4] ;orientation
cmp bl, 1
je trait_vertical


trait_horizontal:
mov bx, ds:[longueur]
boucle_h:
dec bx
inc cx
int 10h
cmp bx, 0
jne boucle_h
jmp fin_dessine

trait_vertical:
mov bx, ds:[longueur]
boucle_v:
dec bx
inc dx
int 10h
cmp bx, 0
jne boucle_v

fin_dessine:
ret 8
dessine endp


code ends



data segment use16
x1 dw 315
y1 dw 235
y2 dw 245
x3 dw 325
y3 dw 235
longueur dw 10
compteur db 0

data ends



pile segment stack


remplissage dw 256 DUP (?)


pile ends


end debut

2 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
11 févr. 2005 à 10:54
salut,

regarde tes mouvements de pile.

@++
0
jo_benni Messages postés 4 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 18 février 2005
11 févr. 2005 à 14:15
Ben j'ai modifié mon programme en me servant d'une variable
interval_cadre que j'ai du déclarer en "dw" et pas en "db" - je
sais pas pourquoi lol - pour éviter tous ces pop ax push ax !



Ca marche toujours pas, je sais pas quoi faire, ca vient peut être de
l'interruption 10h mais normalement non puisqu'elle se sert des
registres cx et dx pour les coordonées des points !



Si quelqu'un trouve une solution...



----------------------------------------------------------------------------------------



.386



code segment use16



assume cs:code, ds:data, ss:pile





debut:



mov ax, data

mov ds, ax



;passage au mode video (640x480)

mov ah, 00h

mov al, 12h

int 10h



répétition_cadre:

mov ax, ds:[interval_cadre]

sub word ptr ds:[x1], ax

sub word ptr ds:[y1], ax

mov dl, 2

mul dl

add word ptr ds:[longueur], ax



push x1 y1 0 couleur ;dessine un carré (x, y, orientation, couleur)

call dessine



push x1 y1 1 couleur

call dessine



mov ax, ds:[interval_cadre]

add word ptr ds:[y2], ax



push x1 y2 0 couleur

call dessine



mov ax, ds:[interval_cadre]

add word ptr ds:[x3], ax

sub word ptr ds:[y3], ax



push x3 y3 1 couleur

call dessine



add byte ptr ds:[compteur], 01d



cmp interval_cadre, 0

jne ajout_pas_5



add word ptr ds:[interval_cadre], 5



ajout_pas_5:

cmp compteur, 26

jne répétition_cadre



;attente frappe touche

frappe:

mov ah, 01h

int
16h
;vérifie le buffer pour voir si une touche du clavier a été enfoncée

je frappe ;si buffer vide, on attend une frappe

mov ah, 00h ;sinon on vide le buffer

int 16h



;retour au mode text

mov ah, 00h

mov al, 00h

int 10h



;arrêt programme

mov ah, 4ch

int 21h







dessine proc near

;sauvegarde adresse début pile

mov bp, sp



mov ah, 0ch

mov al, ss:[bp+2] ;couleur

mov cx, ss:[bp+8] ;x

mov dx, ss:[bp+6] ;y

int 10h



mov bl, ss:[bp+4] ;orientation

cmp bl, 1

je trait_vertical





trait_horizontal:

mov bx, ds:[longueur]

boucle_h:

dec bx

inc cx

int 10h

cmp bx, 0

jne boucle_h

jmp fin_dessine



trait_vertical:

mov bx, ds:[longueur]

boucle_v:

dec bx

inc dx

int 10h

cmp bx, 0

jne boucle_v



fin_dessine:



ret 8

dessine endp



code ends





data segment use16



x1 dw 315

y1 dw 235

y2 dw 245

x3 dw 325

y3 dw 235

longueur dw 10

compteur db 0

interval_cadre dw 0

couleur dw 2



data ends





pile segment stack



remplissage db 256 DUP (?)



pile ends



end debut



-------------------------------------------------------------------------------------------
0
Rejoignez-nous