Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exécuter un .asm dans un .asm

Assembleur 8086

Sujet résolu
    24 mars 2021 à 18:20:14

    Bonjour !

    Nous avons un projet en assembleur pour faire une calculatrice !

    Est-il possible d'ouvrir, et d'exécuter un .asm dans un .asm ?

    Voici le code du "menu calculatrice"

    PILE SEGMENT PARA STACK 'PILE'
            DW 512 DUP(00)                                                  ;DW = Allocates and optionally initializes a word (2 bytes) of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. DW is a synonym of WORD.
    PILE  ENDS
    
    DONNEE SEGMENT															;Partie affichage
    	_main_menu			DB	    ' 1: Decimal',10,' 2: Hexadecimal ',10,' Taper le numero de votre operation: $'
    DONNEE  ENDS
    
    CODE    SEGMENT
    ;-----------------------------------------------------------------------PROCEDURE DE RETOUR A LA LIGNE	
    	RETURN PROC NEAR
    		PUSH        AX													;save the register value, insert in order
    		PUSH        DX													;save the register value, insert in order
    		MOV         DL,10
    		MOV         AH,2
    		INT         21H
    		POP         DX													;take back reg value, take from reverse because push POP function is stack
    		POP         AX													;take back reg value, take from reverse because push POP function is stacks
    		RET																;quit procedure
    	RETURN ENDP															;fin de procedure
    
    
    	PROG_MAIN PROC NEAR
    		ASSUME CS:code,DS:DONNEE,SS:pile
    		; Initialisation
    			MOV	        AX,DONNEE 										;On initialise le segment DONNEE
    			MOV	        DS,AX
    		;Ici, c'est l'affichage du menu qui est concerné
    		_p_main_menu:;afichage du menu			
    				MOV         AH,9
    				LEA         DX,_main_menu
    				INT         21H
    			;On choisit l'opération a effectuer :
    				MOV         AH,1 										;Ici : 1 car on ne demande qu'un seul caracère qui est un nombre
    				INT         21H
    				CALL        RETURN
    			;Puis on teste la selection pour vérifier que l'utilisateur n'entre pas n'importe quoi ._.
    		_p_decimal:
    				CMP         AL,'1'										;Si le nombre entré est > 1
    				JNE         _p_hexa							            ;On va à l'étiquette du menu suivante
    				;OPEN        double.asm	//Ouvrir le fichier ici et l'exécuter							;Sinon, on lance le programme d'addition
    		_p_hexa:
    				CMP         AL,'2'										;Si le nombre entré est > 2
    				JNE         _p_main_menu                						;On va à l'étiquette du menu suivante
    				;CALL        PROG_HEXA //Ouvrir le 2e fichier ici et l'exécuter
    _p_end: MOV AX,4C00H ;Retour au dos INT 21H PROG_MAIN ENDP CODE ENDS END PROG_MAIN

    Il permet de sélectionner si elle sera en Hexadecimal ou Decimal !

    J'ai donc deux programmes différents en .asm

    Et ce programme en .asm aussi !

    Connaissez vous une commande qui me permettrait d'effectuer l'exécution de ces programmes ?


    Merci d'avance !


    -
    Edité par .Sora 24 mars 2021 à 18:21:46

    • Partager sur Facebook
    • Partager sur Twitter

    - The shaping of the question is part of the answer

      24 mars 2021 à 18:34:43

      il y a la directive EXTERN pour indiquer par exemple qu'un sous-programme (plus généralement un symbole) est dans un autre fichier assembleur (il faut que le symbole soit défini en global dans le fichier source où il est défini).

      Après, ça se passe au moment du linker, qui va lier les différents fichiers objets qu'on lui a fourni au moment de la compilation.

      -
      Edité par umfred 24 mars 2021 à 18:34:54

      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2021 à 10:24:19

        umfred a écrit:

        il y a la directive EXTERN pour indiquer par exemple qu'un sous-programme (plus généralement un symbole) est dans un autre fichier assembleur (il faut que le symbole soit défini en global dans le fichier source où il est défini).

        Après, ça se passe au moment du linker, qui va lier les différents fichiers objets qu'on lui a fourni au moment de la compilation.

        -
        Edité par umfred il y a 17 minutes

        Oh merci beaucoup ! Je vais faire plus de recherches au sujet de cette commande !
        Apparemment c'est également possible avec la commande "INCLUDE"

        • Partager sur Facebook
        • Partager sur Twitter

        - The shaping of the question is part of the answer

          25 mars 2021 à 10:48:32

          le nom de la directive doit dépendre du compilateur, mais c'est le même esprit que les include en C (et autres import/using dans les autres langages de plus haut niveau)
          • Partager sur Facebook
          • Partager sur Twitter
            26 mars 2021 à 15:32:34

            umfred a écrit:

            le nom de la directive doit dépendre du compilateur, mais c'est le même esprit que les include en C (et autres import/using dans les autres langages de plus haut niveau)

            Le include fonctionne mais impossible de l'entrer dans le menu car un bon nombre d'erreurs apparaissent ! Auriez vous un exemple de "menu de programmes" ?

            Merci d'avance !!

            • Partager sur Facebook
            • Partager sur Twitter

            - The shaping of the question is part of the answer

              26 mars 2021 à 18:05:35

              Eh ben je vois souvent en ce moment ce projet de calculatrice sur MS-DOS  ^^'

              Normalement l'include devrait fonctionné peut être un bout de code à montré ?
              Sinon c'est faux de dire que l'include fait " d'exécuter un .asm dans un .asm"
              Techniquement , ça permet juste d'inclure une portion de code ou de data dans un code.asm (comme en C quoi :p )

              -
              Edité par HelbaSama 27 mars 2021 à 18:29:29

              • Partager sur Facebook
              • Partager sur Twitter
                27 mars 2021 à 12:14:57

                HelbaSama a écrit:

                Eh ben je vois souvent en ce moment ce projet de calculatrice sur MS-DOS en ce moment ^^'

                Normalement l'include devrait fonctionné peut un bout de code à montré ?
                Sinon c'est faux de dire que l'include fait " d'exécuter un .asm dans un .asm"
                Techniquement , ça permet juste d'inclure une portion de code ou de data dans un code.asm (comme en C quoi :p )

                Merci beaucoup pour vos précisions !   voici le programme de mon "menu"


                PILE SEGMENT PARA STACK 'PILE'
                        DW 512 DUP(00)                                                  ;DW = Allocates and optionally initializes a word (2 bytes) of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. DW is a synonym of WORD.
                PILE  ENDS
                
                DONNEE SEGMENT															;Partie affichage
                	_main_menu			DB	    ' 1: Decimal',10,' 2: Hexadecimal ',10,' Taper le numero de votre operation: $'
                	_nope				DB		'nope'
                	%INCL
                	INCLUDE double.asm
                DONNEE  ENDS
                
                CODE    SEGMENT
                ;-----------------------------------------------------------------------PROCEDURE DE RETOUR A LA LIGNE	
                	RETURN PROC NEAR
                		PUSH        AX													;save the register value, insert in order
                		PUSH        DX													;save the register value, insert in order
                		MOV         DL,10
                		MOV         AH,2
                		INT         21H
                		POP         DX													;take back reg value, take from reverse because push POP function is stack
                		POP         AX													;take back reg value, take from reverse because push POP function is stacks
                		RET																;quit procedure
                	RETURN ENDP															;fin de procedure
                
                
                	PROG_MAIN PROC NEAR
                		ASSUME CS:code,DS:DONNEE,SS:pile
                		; Initialisation
                			MOV	        AX,DONNEE 										;On initialise le segment DONNEE
                			MOV	        DS,AX
                		;Ici, c'est l'affichage du menu qui est concerné
                		_p_main_menu:;afichage du menu			
                				MOV         AH,9
                				LEA         DX,_main_menu
                				INT         21H
                			;On choisit l'opération a effectuer :
                				MOV         AH,1 										;Ici : 1 car on ne demande qu'un seul caracère qui est un nombre
                				INT         21H
                				CALL        RETURN
                			;Puis on teste la selection pour vérifier que l'utilisateur n'entre pas n'importe quoi ._.
                		_p_decimal:
                				CMP         AL,'1'										;Si le nombre entré est > 1
                				JNE         _p_hexadecimal
                				;%INCL							            ;On va à l'étiquette du menu suivante
                				;INCLUDE double.asm
                				;INCLUDE     D:\Projet assembleur\double.asm
                				MOV     AH,9
                				LEA     DX, _nope
                				INT     21h
                		_p_hexadecimal:
                				CMP         AL,'2'										;Si le nombre entré est > 2
                				JNE         _p_main_menu                						;On va à l'étiquette du menu suivante
                				;CALL        PROG_HEXA							;Sinon, on lance le programme de soustraction
                	
                		_p_end:
                			MOV			AX,4C00H ;Retour au dos
                			INT			21H
                	PROG_MAIN  	ENDP
                CODE ENDS
                END PROG_MAIN

                Au niveau de la ligne avec le %INCL et INCLUDE double.asm, cela exécute directement cette première portion du code :) cependant, une fois cette commande incluse dans le menu (commenté ci-dessus), cela m'affiche un bon nombre d'erreurs :(

                Je ne comprends pas vraiment d'où cela vient ... Ni comment y remédier :(

                Merci d'avance pour votre réponse !

                • Partager sur Facebook
                • Partager sur Twitter

                - The shaping of the question is part of the answer

                  27 mars 2021 à 18:34:42

                  C'est simple tu as mis l'include dans les données du segment , donc le compilo va juste remplacé "INCLUDE double.asm" par ce que tu as mis dans "double.asm" , et si double.asm contient du code , ben il râle , parce que dans les "DONNEE SEGMENT" , il s'attend à avoir des data et non du code.
                   
                  Donc si c'est du code ,tu dois le mettre dans "CODE SEGMENT" , par contre , ne le met pas au début hein , un code MS-DOS ne fonctionne pas forcément au début du label "main" , le .com ne gère pas les point d'entrée , donc le code commence tout simplement au début du fichier.

                  -
                  Edité par HelbaSama 27 mars 2021 à 18:39:58

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 mars 2021 à 19:12:19

                    HelbaSama a écrit:

                    C'est simple tu as mis l'include dans les données du segment , donc le compilo va juste remplacé "INCLUDE double.asm" par ce que tu as mis dans "double.asm" , et si double.asm contient du code , ben il râle , parce que dans les "DONNEE SEGMENT" , il s'attend à avoir des data et non du code.
                     
                    Donc si c'est du code ,tu dois le mettre dans "CODE SEGMENT" , par contre , ne le met pas au début hein , un code MS-DOS ne fonctionne pas forcément au début du label "main" , le .com ne gère pas les point d'entrée , donc le code commence tout simplement au début du fichier.

                    -
                    Edité par HelbaSama il y a 28 minutes

                    Oh ! je pense que je me suis mal exprimée :(( Lorsque que le include est dans la partie DONNEE SEGMENT, cela lance le bout de programme, aucun problème là dessus :)

                    _p_decimal:
                    CMP         AL,'1'                                      ;Si le nombre entré est > 1
                    JNE         _p_hexadecimal
                    ;%INCL                                      ;On va à l'étiquette du menu suivante
                    ;INCLUDE double.asm
                    ;INCLUDE     D:\Projet assembleur\double.asm
                    MOV     AH,9
                    LEA     DX, _nope
                    INT     21h
                    _p_hexadecimal:
                    CMP         AL,'2'                                      ;Si le nombre entré est > 2
                    JNE         _p_main_menu                                        ;On va à l'étiquette du menu suivante
                    ;CALL        PROG_HEXA                          ;Sinon, on lance le programme de soustraction
                    _p_end:
                    MOV         AX,4C00H ;Retour au dos
                    INT         21H
                    PROG_MAIN   ENDP
                    CODE ENDS
                    END PROG_MAIN

                    C'est lors de l'intégration dans le menu que cela pose problème, lorsque que l'on appelle le INCLUDE dans une partie du menu (exemple: dans _à_hexadecimal, un tas d'erreur apparaissent ! Pourtant cela se situe dans le segment code ?)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    - The shaping of the question is part of the answer

                      27 mars 2021 à 20:16:43

                      Personnellement je déconseille de mettre un include en plein milieu d'une condition (fait tu ça en C ou dans n'importe quel autre langage ? :p ) , en général , un include , on s'attend à un ensemble de fonction.

                      après ça dépend des erreurs que tu as tout simplement (si tu peut les mettre ici ) , cela peut être aussi à cause des doublons (même label) , celà dépend de ce que tu as mis dans double.asm tout simplement.

                      Et tu utilise quel compilo ?
                      ça ne ressemble pas à du NASM à ce que je lis.

                      -
                      Edité par HelbaSama 27 mars 2021 à 20:19:15

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mars 2021 à 8:28:58

                        HelbaSama a écrit:

                        Personnellement je déconseille de mettre un include en plein milieu d'une condition (fait tu ça en C ou dans n'importe quel autre langage ? :p ) , en général , un include , on s'attend à un ensemble de fonction.

                        après ça dépend des erreurs que tu as tout simplement (si tu peut les mettre ici ) , cela peut être aussi à cause des doublons (même label) , celà dépend de ce que tu as mis dans double.asm tout simplement.

                        Et tu utilise quel compilo ?
                        ça ne ressemble pas à du NASM à ce que je lis.

                        -
                        Edité par HelbaSama 27 mars 2021 à 20:19:15

                        j'ai utilisé VSCode et une estension MASM/TASM pour compiler avec Dosbox :)

                        (fait tu ça en C ou dans n'importe quel autre langage ? :p ) : Non :') il y a donc moyen de les inclure et de les lancer plus tard ?

                        • Partager sur Facebook
                        • Partager sur Twitter

                        - The shaping of the question is part of the answer

                          29 mars 2021 à 9:50:06

                          "Non :') il y a donc moyen de les inclure et de les lancer plus tard ?"

                          Oui en faisant une fonction tout simplement :)
                          (donc tout simplement utiliser call/ret )

                          -
                          Edité par HelbaSama 29 mars 2021 à 9:50:42

                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2021 à 11:50:36

                            HelbaSama a écrit:

                            "Non :') il y a donc moyen de les inclure et de les lancer plus tard ?"

                            Oui en faisant une fonction tout simplement :)
                            (donc tout simplement utiliser call/ret )

                            -
                            Edité par HelbaSama il y a environ 1 heure


                            Merci beaucoup :D

                            Cependant je ne sais pas vraiment comment utiliser ces commandes, je vais faire rechercher d'autres exemples :))

                            • Partager sur Facebook
                            • Partager sur Twitter

                            - The shaping of the question is part of the answer

                              29 mars 2021 à 12:48:44

                              Ce n'est pas très compliqué , voici un exemple rapide (peut etre qu'il faudra l'adapté à la syntaxe MASM/TASM) :

                              main:
                                  ;code
                                  call mafonction
                                  ;code
                              
                              ;(par exemple mafonction se trouve dans un include )
                              mafonction:
                              
                              ;mon code
                              
                              ret
                              
                              


                              -
                              Edité par HelbaSama 29 mars 2021 à 12:49:19

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Exécuter un .asm dans un .asm

                              × 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