Partage
  • Partager sur Facebook
  • Partager sur Twitter

Assembleur 8086 initialisation de variable

Gros bug

    31 mars 2020 à 11:52:58

    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...
    Merci de votre aide

    -
    Edité par ChloéBlblbl 31 mars 2020 à 11:57:21

    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2020 à 16:50:35

      Bonjour.

      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

      • Partager sur Facebook
      • Partager sur Twitter

      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.
      • Editeur
      • Markdown