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
- The shaping of the question is part of the answer
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.
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"
- The shaping of the question is part of the answer
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 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 !!
- The shaping of the question is part of the answer
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 )
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 )
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 !
- The shaping of the question is part of the answer
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.
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 ?)
- The shaping of the question is part of the answer
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 ? ) , 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.
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 ? ) , 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 ? ) : Non :') il y a donc moyen de les inclure et de les lancer plus tard ?
- The shaping of the question is part of the answer
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
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.
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer
- The shaping of the question is part of the answer