Bonjour, je viens vers vous car cela fait 2 jours que je perds mon temps à comprendre mon programme :
Je code un morpion en assembleur x8086 sur VScode, avec Dosbox.
J'ai crée 9 variables pour tester l'état d'une case : 0 pour vide, 1 pour occupée par J1 et 2 pour occupée par J2
Mes variables sont HG,HM...MM...BM pour HautGauche, Milieu Milieu, Bas Milieu (vous voyez l'idée)
Mais lors de l'initialisation dans le DSEG, j'ai d'autres valeurs que 0 au départ
Voici mon DSEG
DSEG SEGMENT
MSGJEU db "Nouvelle Partie$"
MSGHELP db "Aide$"
Aide_1 db "Bienvenue dans l'aide$", 0DH, 0AH
Aide_2 db "Pour retourner en arriere, appuyez sur echap$", 0DH, 0AH
Aide_3 db "Vous pouvez retourner en arriere a n'importe quel moment du jeu, mais rien ne sera sauvegarde$", 0DH, 0AH
Aide_4 db "Le morpion se joue a 2 joueurs. Choisissez qui commence en premier avec les fleches gauche et droite$", 0DH, 0AH
Aide_5 db "Pour jouer, deplacez vous chacun votre tour avec les fleches puis validez avec entree$",0DH, 0AH
MSGFIN db "Quitter$"
WHOPLAY db "Qui commence en premier ?$"
FLECH db "->$"
JOUEUR1 db "Joueur 1$"
JOUEUR2 db "Joueur 2$"
MSG_JOUEUR1 db "Au Joueur 1 de jouer $"
MSG_JOUEUR2 db "Au Joueur 2 de jouer $"
CRS_MENU db 5
CRS_JR db 0
J1 db 0 ; à partir d'ici l'initialisation ne sert à rien
J2 db 0
VARX dw 85 ; car pas reconnu par le pc
VARY dw 35 ; je ne sais pas pourquoi ce n'est pas pris en compte
VARSTOP dw 10
HG DB 0
HM DB 0
HD DB 0
MG DB 0
MM DB 0
MD DB 0
BG DB 0
BM DB 0
BD DB 0
DSEG ENDS
Mon code d'affichage est celui :
mov ah,01H ;on vide le buffer clavier
int 16H
jz SELECT3 ; Aller à boucle si aucun caractère présent
mov ah,00h
int 16H
SELECT3 :
MOV AH,00H
INT 16h
CMP AX,011Bh ;si on appuie sur echap
JE Part_jeu
CMP AL,'a' ;si on appuie sur a
JE CASE_HG
CMP AL,'z' ;si on appuie sur z
JE CASE_HM
CMP AL,'e' ;si on appuie sur e
JE CASE_HD
CMP AL,'q' ;si on appuie sur q
JE CASE_MG
CMP AL,'s' ;si on appuie sur s
JE CASE_MM
CMP AL,'d' ;si on appuie sur d
JE CASE_MD
CMP AL,'w' ;si on appuie sur w
JE CASE_BG
CMP AL,'x' ;si on appuie sur x
JE CASE_BM
CMP AL,'c' ;si on appuie sur c
JE CASE_BD
JMP SELECT3
;Les booleens : HG appartenant à J1
; = 2, case appartenant à J2
; = 0, case vide
; J1 = 1, c'est à J1 de jouer
; J2 = 2, c'est à J2 de jouer
CASE_HG :
MOV DL,HG ;on affiche le caractère stocké dans HG
ADD DL,30H
MOV AH,02
INT 21H
CMP HG,0 ; on compare ce caractère à 0
JNE SELECT3 ; si ce n'est pas vide, on fait une nouvelle sélection
MOV VARX,130
MOV VARY,40
CMP J1,2 ;si J1 vaut 20 , J2 est alors à 10 et c'est J2 qui joue
JE Case_J2
CALL Croix
JMP SELECT3
Or, j'ai tout sauf un 0 qui sont stockés dans mes variables
Auriez-vous une idée ?
Je tiens à préciser que j'ai mis mon DSEG dans un fichier test et j'ai ca
DSEG SEGMENT
MESSAGE DB "Bonjour, veuillez saisir un nouveau message", 0DH,0AH, '$'
TAMPON DB 100,?, 100 DUP ('$')
L_TAMPON EQU $-TAMPON
VARX dw 85
VARY dw 35
VARSTOP dw 0
HG DB 0
HM DB 0
HD DB 0
MG DB 0
MM DB 0
MD DB 0
BG DB 0
BM DB 0
BD DB 0
J1 DB 1
J2 DB 2
nomfichier DB "Fichessai.txt",0
DSEG ENDS
Avec cela, tout fonctionne parfaitement, mais si l'on enlève nomficher db et toute les var de message, plus rien ne fonctionne
Je ne comprends vraiment pas, je suis complètement perdue...
Pourquoi décris tu les données dans un segment DSEG ? ne faut-il pas mieux utiliser le segment .data ?
Cet assembleur est un vieil assembleur. Il y a des assembleurs 32 bits pour Windows ou Linux plus modernes. Mais c'est ton choix.
Bon courage.
Suite réflexion de la nuit :
J'avais pas bien percuté hier mais HG n'est qu'un label cad une adresse mémoire et donc pour récupère le caractère contenu dans HG il faut mettre HG entre crochet comme ceci mov dl,[HG] et je pense aussi que si tu veut récupérer un octet il faut ajouter BYTE ce qui donne :
mov dl, BYTE [HG]
idem pour l'instruction de comparaison
cmp byte [HG],0
Bon courage.
- Edité par PaulDurelin 1 avril 2020 à 10:24:08
Assembleur 8086 initialisation de variable
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.