Se connecter / S'enregistrer
Votre question

[ASSEMBLEUR] problème compilo NASM

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
4 Février 2007 11:53:33

Bonjour,
j'ai commencé le tutoriel de Benoît M. (bravo au passage ;)  ) sur l'assembleur.
http://benoit-m.developpez.com/assembleur/tutoriel/Cour...
  1. .386
  2.  
  3. code segment use16
  4.  
  5. assume cs:code, ds:code, ss:code
  6.  
  7. org 100h ;offsets décalés de 100h = 256
  8.  
  9. debut :
  10.  
  11. mov ah, 09h ;fonction n°9 : écrire une chaîne … l'écran
  12. mov dx, offset message ;mettre l'offset de la chaîne dans DX
  13. int 21h ;écrire la chaîne … l'écran en appelant l'interruption 21h
  14.  
  15.  
  16. ret ;rendre la main au DOS
  17.  
  18. message db "Bonjour tout le monde !", '$' ;définition du message
  19.  
  20. code ends
  21.  
  22. end debut


J'ai essayé de l'adapter pour NASM ce qui me donne le code suivant:
  1. bits 16
  2.  
  3. assume cs:code, ds:code, ss:code
  4.  
  5. org 100h ;offsets décalés de 100h = 256
  6.  
  7. debut :
  8.  
  9. mov ah, 09h ;fonction nø9 : ‚crire une chaŒne … l'‚cran
  10. mov dx, offset message ;mettre l'offset de la chaŒne dans DX
  11. int 21h ;‚crire la chaŒne … l'‚cran en appelant l'interruption 21h
  12.  
  13.  
  14. ret ;rendre la main au DOS
  15.  
  16. message db "Bonjour tout le monde !", '$' ;définition du message
  17.  
  18. code ends
  19.  
  20. end debut


Dans AsmEditor, la compilation par Nasm me renvoie "code de sortie de nasmw.exe:1" mais aucun fichier .com n'est créé.

Dans NasmIDE, ce code génère des erreurs:

  1. error: parser: instruction expected
  2. error: comma or end of line expected
  3. error: parser: instruction expected
  4. error: parser: instruction expected


Pouvez-vous m'indiquer le code à changer parceque c'est assez frustrant :p 

merci =)
" target="_blank">
N'ayant pas TASM, j'utilise NASM. Le code du premier programme génère des erreurs:
  1. .386
  2.  
  3. code segment use16
  4.  
  5. assume cs:code, ds:code, ss:code
  6.  
  7. org 100h ;offsets décalés de 100h = 256
  8.  
  9. debut :
  10.  
  11. mov ah, 09h ;fonction n°9 : écrire une chaîne … l'écran
  12. mov dx, offset message ;mettre l'offset de la chaîne dans DX
  13. int 21h ;écrire la chaîne … l'écran en appelant l'interruption 21h
  14.  
  15.  
  16. ret ;rendre la main au DOS
  17.  
  18. message db "Bonjour tout le monde !", '$' ;définition du message
  19.  
  20. code ends
  21.  
  22. end debut


J'ai essayé de l'adapter pour NASM ce qui me donne le code suivant:
  1. bits 16
  2.  
  3. assume cs:code, ds:code, ss:code
  4.  
  5. org 100h ;offsets décalés de 100h = 256
  6.  
  7. debut :
  8.  
  9. mov ah, 09h ;fonction nø9 : ‚crire une chaŒne … l'‚cran
  10. mov dx, offset message ;mettre l'offset de la chaŒne dans DX
  11. int 21h ;‚crire la chaŒne … l'‚cran en appelant l'interruption 21h
  12.  
  13.  
  14. ret ;rendre la main au DOS
  15.  
  16. message db "Bonjour tout le monde !", '$' ;définition du message
  17.  
  18. code ends
  19.  
  20. end debut


Dans AsmEditor, la compilation par Nasm me renvoie "code de sortie de nasmw.exe:1" mais aucun fichier .com n'est créé.

Dans NasmIDE, ce code génère des erreurs:

  1. error: parser: instruction expected
  2. error: comma or end of line expected
  3. error: parser: instruction expected
  4. error: parser: instruction expected


Pouvez-vous m'indiquer le code à changer parceque c'est assez frustrant :p 

merci =)
" target="_blank">http://benoit-m.developpez.com/assembleur/tutoriel/Cour...
  1. .386
  2.  
  3. code segment use16
  4.  
  5. assume cs:code, ds:code, ss:code
  6.  
  7. org 100h ;offsets décalés de 100h = 256
  8.  
  9. debut :
  10.  
  11. mov ah, 09h ;fonction n°9 : écrire une chaîne … l'écran
  12. mov dx, offset message ;mettre l'offset de la chaîne dans DX
  13. int 21h ;écrire la chaîne … l'écran en appelant l'interruption 21h
  14.  
  15.  
  16. ret ;rendre la main au DOS
  17.  
  18. message db "Bonjour tout le monde !", '$' ;définition du message
  19.  
  20. code ends
  21.  
  22. end debut


J'ai essayé de l'adapter pour NASM ce qui me donne le code suivant:
  1. bits 16
  2.  
  3. assume cs:code, ds:code, ss:code
  4.  
  5. org 100h ;offsets décalés de 100h = 256
  6.  
  7. debut :
  8.  
  9. mov ah, 09h ;fonction nø9 : ‚crire une chaŒne … l'‚cran
  10. mov dx, offset message ;mettre l'offset de la chaŒne dans DX
  11. int 21h ;‚crire la chaŒne … l'‚cran en appelant l'interruption 21h
  12.  
  13.  
  14. ret ;rendre la main au DOS
  15.  
  16. message db "Bonjour tout le monde !", '$' ;définition du message
  17.  
  18. code ends
  19.  
  20. end debut


Dans AsmEditor, la compilation par Nasm me renvoie "code de sortie de nasmw.exe:1" mais aucun fichier .com n'est créé.

Dans NasmIDE, ce code génère des erreurs:

  1. error: parser: instruction expected
  2. error: comma or end of line expected
  3. error: parser: instruction expected
  4. error: parser: instruction expected


Pouvez-vous m'indiquer le code à changer parceque c'est assez frustrant :p 

merci =)
" target="_blank">
N'ayant pas TASM, j'utilise NASM. Le code du premier programme génère des erreurs:
  1. .386
  2.  
  3. code segment use16
  4.  
  5. assume cs:code, ds:code, ss:code
  6.  
  7. org 100h ;offsets décalés de 100h = 256
  8.  
  9. debut :
  10.  
  11. mov ah, 09h ;fonction n°9 : écrire une chaîne … l'écran
  12. mov dx, offset message ;mettre l'offset de la chaîne dans DX
  13. int 21h ;écrire la chaîne … l'écran en appelant l'interruption 21h
  14.  
  15.  
  16. ret ;rendre la main au DOS
  17.  
  18. message db "Bonjour tout le monde !", '$' ;définition du message
  19.  
  20. code ends
  21.  
  22. end debut


J'ai essayé de l'adapter pour NASM ce qui me donne le code suivant:
  1. bits 16
  2.  
  3. assume cs:code, ds:code, ss:code
  4.  
  5. org 100h ;offsets décalés de 100h = 256
  6.  
  7. debut :
  8.  
  9. mov ah, 09h ;fonction nø9 : ‚crire une chaŒne … l'‚cran
  10. mov dx, offset message ;mettre l'offset de la chaŒne dans DX
  11. int 21h ;‚crire la chaŒne … l'‚cran en appelant l'interruption 21h
  12.  
  13.  
  14. ret ;rendre la main au DOS
  15.  
  16. message db "Bonjour tout le monde !", '$' ;définition du message
  17.  
  18. code ends
  19.  
  20. end debut


Dans AsmEditor, la compilation par Nasm me renvoie "code de sortie de nasmw.exe:1" mais aucun fichier .com n'est créé.

Dans NasmIDE, ce code génère des erreurs:

  1. error: parser: instruction expected
  2. error: comma or end of line expected
  3. error: parser: instruction expected
  4. error: parser: instruction expected


Pouvez-vous m'indiquer le code à changer parceque c'est assez frustrant :p 

merci =)

Autres pages sur : assembleur probleme compilo nasm

4 Février 2007 13:40:58

voila le code
  1. BITS 16
  2. ORG 100h
  3.  
  4. SECTION .data
  5. message: db "Bonjour tout le monde !", '$'
  6.  
  7. SECTION .text
  8. global main
  9.  
  10.  
  11. main:
  12. mov ah, 09h ;fonction n�9 : �crire une cha�ne � l'�cran
  13. mov dx, message ;mettre l'offset de la cha�ne dans DX
  14. int 21h ;�crire la cha�ne � l'�cran en appelant l'interruption 21h
  15. ret ;rendre la main au DOS
4 Février 2007 14:22:28

oki merci je vais tester ce code sans plus attendre, y'a-t-il beaucoup d'autres changement entre TASM et NASM ?

merci encore =)
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
4 Février 2007 14:47:01

Ne t'inquiète pas pour ça, l'assembleur est très proche de la machine, ce ne sont que quelques détails d'écriture qui changent, surtout ce qui permet de structurer le code (tout ce que tu viens de voir).
Le reste est proche du langage machine, tu peux décompiler le .COM pour voir que la compilation ne fait pas grand chose ;) 
Une autre différence serait des instructions qui ne seraient pas supporté par le compilateur, mais il y a toujours moyen de contourner.
4 Février 2007 15:24:33

Merci cette fois-ci NASM veut bien me compiler ce petit fichier. Il me reste quand même quelques soucis:

- lorsque j'exécute le fichier .com, la fenêtre DOS s'ouvre puis se ferme instantanément, je ne sais pas si c'est normal ou pas.

- lorsque je veux compiler le fichier .ASM à partir de AsmEditor, aucune erreur n'apparaît avec le compilateur NASM mais aucun fichier n'est crée. Je pense que j'ai mal configuré le compilateur NASM dans AsmEditor.

Voici les caractéristiques que je lui ai mis:

Citation :

nom du compilateur: NASM
lignes de commande: "E:\program files\nasm\nasmw.exe" "<Asm>" "<AsmNoExt><Ext>"
fichier généré: <AsmNoExt><Ext>

la case "effacer la fenêtre de résultats avant chaque compilation" n'est pas cochée.
la case "continuer le processus de compilation même en cas d'erreur" n'est pas cochée.



En fait j'ai pris les paramètres de FASM (compilateur par défaut) et je les ai adaptés pour NASM.

merci :) 
a b L Programmation
4 Février 2007 15:56:53

1. c'est normal, il fait ce qu'il a à faire, puis il quitte.
Si tu veux mettre une attente d'appui de touche:
  1. MOV AH, 07h
  2. INT 21h

Interruption 21h (DOS), fonction 7.

2.
  1. nasmw fichier.asm -o fichier.com

Ajoute le "-o"
4 Février 2007 16:01:55

Okay ca va faire pas mal d'interruptions à apprendre ^^ mais bon ce langage m'interesse vraiment !

donc ma configuration dans AsmEditor serait:
Citation :

"E:\program files\nasm\nasmw.exe" "<Asm>"-o "<AsmNoExt><Ext>"
?


merci encore =)
4 Février 2007 16:30:00

Merci beaucoup ça fonctionne à merveille !

Il ne reste qu'une chose qui me chagrine, c'est que je ne comprends pas trop le début du code:

BITS 16 indique qu'on travail en 16 bits
org 100h décale tout les offsets de 100h car il y a le PSP au début du segment

mais par contre je ne comprends pas:
  1. SECTION .data
  2.  
  3. SECTION .text
  4. global main


est-ce que cela remplace le :
  1. assume cs:code, ds:code, ss:code

??

et oui je sais j'aime bien tout comprendre :) 

par exemple quel serait le code pour le programme .exe qui suit plz ? après j'arrête avec mes questions :) 
a b L Programmation
4 Février 2007 17:48:58

CS, DS et SS sont des registres correspondant à Code Segment, Data Segment et Stack Segment.
donc CS contient l'adresse du début de zone du code exécutable, DS pour les données et SS pour la pile.
Dans le assume, tu places tous ces registres sur l'adresse "code".

Un .exe est un peu différent du .com, il y a format plus complet.
4 Février 2007 18:18:33

oki donc en fait nasm se charge automatiquement de mettre les bonnes adresses sur les bons segments si je comprends bien.
J'ai un peu lu la documentation de NASM histoire de comprendre un peu comment ca se passe. j'ai compri que lorsque l'on fait un .COM, on met les données apres le
  1. SECTION .data


et le code apres le
  1. SECTION .text


apres par contre je ne connais pas pour les .exe

enfin bon y'a quand même pas mal de différences j'ai l'impression... (je viens de découvrir que NASM ne gerrais pas le "?" de TASM... enfin ou alors je l'ai mal écrit)...

vous connaissez pas une page où c'est expliqué ?

merci encore :D 
a b L Programmation
4 Février 2007 18:55:32

le "?", après les DB ?
4 Février 2007 21:12:21

ui j'ai essayé de le faire une fois, il m'a trouvé une erreur.. bon en tout cas merci !! J'ai l'impression que la doc peut m'être très utile, y'a pas mal de trucs sur les spécifications comme celle qu'il me faut :) 

merci encore et n'hésitez pas si vous avez d'autres choses à dire :) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS