IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Comment permettre que mon message affiché reste visible ?


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut Comment permettre que mon message affiché reste visible ?
    Bonjour,

    Voilà, j'ai décidé de me mettre à l'assembleur avec (ou du moins faire des programmes de bases) et j'ai fais un petit un petit mon programme .com compilé et qui devrait s'executer avec AsmEditor, cependant lorsque j'execute le programme sous Windows, une fênetre noire s'ouvre et je n'ai pas le temps de voir mon petit message "Bonjour !", y'aurait-il un moyen qui permettrait de faire durer mon petit programme .com en restant sous Windows et non en l'executant avec le DOS?

    Voici mon petit programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    .386
     
    code segment use16
     
    org 100h
     
    début :
     
    mov ah, 09h
    move dx, offset message
    int 21h
     
    ret
     
    message db "Bonjour !", '$'
     
    code ends
     
    end debut
    Merci

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 646
    Points
    59 646
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Tu peux attendre la frappe d'une touche avant la fin du programme en ajoutant :
    Et pour qu'un programme se termine proprement, il faut appeler la fonction 4Ch de l'interruption 21h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov ax,4C00h   ; 00h = code d'erreur renvoyé au système
    int 21h

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    J'ai un nouveau problème maintenant, j'ai inséré ce que tu m'as dis mais maintenant Windows dit que le processeur NTVDM a rencontré une instruction non autorisée...

    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Là, ça marche en supprimmant ; 00h = code d'erreur renvoyé au système car j'imagine que ce n'était pas une commande assembleur vu que c'était en italique mais toujours le même problème : une petit fenêtre noire apparaît et 100 ms plus tard disparait, pourtant j'ai bien insérer ce que tu m'as dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    .386
     
    code segment use16
     
    org 100h
     
    début :
     
    mov ah, 09h
    move dx, offset message
    int 21h
     
    ret
     
    message db "Bonjour !", '$'
     
    mov ah,07h
    int 21h
     
    code ends
     
    end debut
     
    mov ax,4C00h
    int 21h
    Les lignes de codage que tu m'as dis de mettre sont bien placées au moins?
    Car j'en suis pas sûr...

    Ah, et puis quand j'essaie de compiler mon programme aussi maintenant il me met un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    >> Exécution de C:\Program Files\Astase\AsmEditor\Fasm\Fasm.exe "C:\Documents and Settings\H\Bureau\Programme.com" "C:\Documents and Settings\H\Bureau\Programme.com"
    flat assembler  version 1.41
    C:\Documents and Settings\H\Bureau\Programme.com [3]:
    code segment use16
    error: reserved word used as symbol.
     
    >> Code de sortie de Fasm.exe : 1
    =
    >> Exécution de C:\Program Files\Astase\AsmEditor\Fasm\Fasm.exe "C:\Documents and Settings\H\Bureau\Programme.com" "C:\Documents and Settings\H\Bureau\Programme.com"
    flat assembler  version 1.41
    C:\Documents and Settings\H\Bureau\Programme.com [3]:
    code segment use16
    error: reserved word used as symbol.
     
    >> Code de sortie de Fasm.exe : 1
    Merci aussi.

  5. #5
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    Si tu es en mode réel (16 bits), tu peux appeler l'interruption 16h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	xor ax, ax
    	int 16h
    Tant qu'une touche du clavier n'est pas pressée, le programme reste en attente et ta fenêtre ne disparaîtra pas.
    Equivalent à un "repeat until keypressed" en pascal ou un "while (!kbhit())" en C.

    Petit détail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov ax,4C00h
    int 21h
    doit être placé AVANT le "code ends" et "end debut"

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Merci la fênetre noire s'ouvre et reste tant que je ne clique pas sur le croix, je vois le nom de mon programme mais maintenant le message ne s'affiche pas!
    Pourtant, je n'ai fais pas une erreur dans le codage, dites-moi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    .386
     
    code segment use16
     
    org 100h
     
    début :
     
    mov ah, 09h
    move dx, offset message
    int 21h
     
    ret
     
    message db "Bonjour !", '$'
     
     
    mov ah,07h
    int 21h
     
    code ends
     
    end debut
    En image le soi disant "bug" : http://img259.imageshack.us/img259/8...embleurki6.jpg

    L'autre fois le curseur s'amusait à sauter des lignes mais rien, pas de message qui s'affiche, ah et si je pouvais également intégrer mon programme au démarrage de l'ordinateur, je vous en serai reconnaissant.

    Merci

  7. #7
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Il y a en effet quelques problèmes dans votre code :
    - le ret en plein milieu du code fait référence à quel call ?
    - on vous a dit que le code suivant était mal placé, pas qu'il fallait le supprimer :
    Bon courage

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Je l'ai remis mais à présent, c'est comme au début la fenêtre noire s'ouvre et se ferme tout de suite, je l'ai bien placé au bon endroit dans le codage? Si non, merci de le corriger en faisant un nouveau code avec tout le programme entier et une partie en gras du mauvais codage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    code segment use16
     
    org 100h
     
    début :
     
    mov ah, 09h
    move dx, offset message
    int 21h
     
    ret
     
    message db "Bonjour !", '$'
     
     
    mov ah,07h
    int 21h
     
    mov ax,4C00h
    int 21h
     
    code ends
     
    end debut

  9. #9
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    Comme Juju_41 te l'a déjà dit, le ret au beau milieu du code semble poser problème.
    Je ne connais pas FASM, mais je me demande si ce ret n'empêche pas l'exécution de ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mov ah,07h
    int 21h
     
    mov ax,4C00h
    int 21h

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Le problème de votre programme se situe au niveau de l'instruction ret.

    Le rôle de l'instruction ret est de dépiler une adresse puis de sauter à cette adresse. Cette instruction s'utilise généralement conjointement avec l'instruction call, pour créer des sous programmes.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ...
    du code
    ...
    call sous_programme
    ...
    suite du code
    ...
    fin du programme
     
    sous_programme:
    ...
    code du sous programme
    ...
    ret
    L'instruction ret ne doit donc pas être utilisée dans votre programme.

    Au début de votre programme, vous affichez un message puis le déclarez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mov ah, 09h
    move dx, offset message
    int 21h
    ret ; cette instruction ne doit pas être utilisée ici
    message db "Bonjour !", '$'
    Après avoir afficher le message, vous devez renvoyer le flux d'instruction après les données du message.
    Pour ce faire, vous devez uiliser l'instruction jmp pour sauter après les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov ah, 09h
    move dx, offset message
    int 21h
    jmp suite_du_code
    message db "Bonjour !", '$'
    suite_du_code:
    Une autre solution consiste à placer les données du programme après la fin du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    code segment use16
    org 100h
     
    début :
    mov ah, 09h
    move dx, offset message
    int 21h
     
    mov ah,07h
    int 21h
     
    mov ax,4C00h
    int 21h
     
    message db "Bonjour !", '$'
     
    code ends
     
    end debut

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    J'aimerai bien mais il met me que le processus NVTDM a rencontré une instruction non autorisée...

    Pourriez-vous svp, refaire mon programme en entier et corrigé pour que le programme marche bien?

    J'ai enlevé l'intrusction ret mais maintenant il grogne parce que le processus a rencontré une instruction non autorisée et quand j'insère votre code, c'est la même chose...

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pour éviter tout problème, commence par écrire un programme simple :
    • début du programme
    • attente d'une touche
    • fin du programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    code segment use16
    org 100h
     
    début :
    ; attendre la frappe d'une touche
    mov ah,07h
    int 21h
     
    ; fin du programme
    mov ax,4C00h
    int 21h
     
    fin:
    jmp fin
     
    code ends
    end debut
    La particularité du programme se situe au niveau des lignes suivantes :
    Elles permettent de faire tourner le programme en boucle au cas où l'exécution du programme se poursuit après l'interruption terminant le programme.
    Cela evite que d'éventuelles instructions ou données se situant après la findu programme soient exécutées.

    Ce programme fonctionne-t-il ?
    Si non, indique-nous quelles erreurs tu obtiens.
    Si oui, tu peux poursuivre.

    Ajoute au code précédent les lignes permettant d'afficher le message.
    Le nouveau programme fonctionne-t-il ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Cela ne marche toujours pas, le processeur a rencontré une instruction non autorisée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    code segment use16
    org 100h
     
    début :
    ; attendre la frappe d'une touche
    mov ah,07h
    int 21h
     
    ; fin du programme
    mov ax,4C00h
    int 21h
     
    message db "Bonjour !", '$'
     
    fin:
    jmp fin
     
    code ends
    end debut

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Essaye en plaçant les lignes
    avant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message db "Bonjour !", '$'
    Code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    code segment use16
    org 100h
     
    début :
    ; attendre la frappe d'une touche
    mov ah,07h
    int 21h
     
    ; fin du programme
    mov ax,4C00h
    int 21h
     
    fin:
    jmp fin
     
    message db "Bonjour !", '$'
     
    code ends
    end debut

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Toujours et toujours la même chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    code segment use16
    org 100h
     
    début :
    ; attendre la frappe d'une touche
    mov ah,07h
    int 21h
     
    ; fin du programme
    mov ax,4C00h
    int 21h
     
    fin:
    jmp fin
     
    message db "Bonjour !", '$'
     
    code ends
    end debut
    Mais mon programme est bien un fichier.com ok on est d'accord mais quand je compile le programme il met "code segment use 16" et une ligne en bas : "error reserved word used as symbol", je ne sais pas si ça a un rapport ou non, je fais mon programme avec AsmEditor, plus précisément Flast Assembler...

  16. #16
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 646
    Points
    59 646
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Pas besoin de spécifier de directive segment ou [use16] : en sélectionnant .com dans la barre d'outils d'AsmEditor, FASM produira automatiquement le bon format d'exécutable.

    Le code suivant compile et s'exécute très bien sous AsmEditor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    org 100h
     
    mov ah, 09h
    mov dx,message
    int 21h
     
    mov ah,07h
    int 21h
     
    mov ax,4C00h
    int 21h
     
    message: db "Bonjour !", '$'

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Bien le merci à toi, ça marche !!
    Voici le screen de mon programme :

    http://img167.imageshack.us/img167/6859/bonjourzq0.jpg

    Mais y'aurait-il un moyen maintenant de l'intégrer au registre pour qu'il s'éxecute à chaque demarrage de l'ordinateur?

    Merci

  18. #18
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    Tu veux dire, au démarrage de Windows?

    Si tu veux intégrer ton programme au registre, c'est possible. Il fera partie des programmes lancés au démarrage de Windows.
    La procédure utilisant le registre est indiquée dans la FAQ Windows :
    Par la base de registre :
    Lancez la base de registre (Démarrer > Exécuter > Tapez "regedit"), développez l'arborescence HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, créez une valeur de type "String", donnez-lui le nom du programme à lancer, et entrez comme valeur le chemin vers l'exécutable.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Y'a pas de string, je choisis quoi?

  20. #20
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    tu traduis "String" en anglais par "Chaîne" en français.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/05/2009, 09h11
  2. Comment éviter que mon annimation rame
    Par arnaudperfect dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 08/02/2009, 21h54
  3. Réponses: 1
    Dernier message: 16/01/2006, 10h15
  4. [XML]Comment tester que mon fichier XML est comme ceci?
    Par Devil666 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2005, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo