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 16-bits Assembleur Discussion :

[NASM] Mettre le programme en pause - boucle infinie


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [NASM] Mettre le programme en pause - boucle infinie
    Bonjour,

    je suis débutant en ASM et j'ai eu un petit problème dons ce 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
    22
    23
    24
    25
    26
    27
    segment text
     
    	start:
    MOV DX, message1
    MOV AH,09h
    INT 21h
     
    MOV DX, entree
    MOV AH, 0Ah
    INT 21h
     
    MOV DX, message2
    MOV AH,09h
    INT 21h
     
    MOV DX, entree
    MOV AH,09h
    INT 21h
     
    segment data
    message1 db "Bonjour, comment vous appellez vous ?", '$'
    message2 db  13, 10, "vous vous appelez donc", '$' 
     
     
    segment bss
    entree db 100,0, 
    	times 100 db ($)
    C'est du nasm. D'abord, le programme s'allume et puis s'arrete directement : comment faire pour mettre le programme en pause ?
    Ensuite, lorsque j'insère l'instruction ret à la fin j'ai un gros bug genre une boucle infinie.

    Merci d'avance,

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    J'imagine que tu programmes sous Windows (et pas depuis un émulateur D.O.S. sous Unix ou autre). Quel genre d'exécutable généres-tu ? Un fichier *.com ou un *.exe ? Avant toute chose, je te conseille, si ce n'est pas déjà le cas, d'ouvrir une boîte D.O.S. et de lancer ton exécutable depuis cette boîte plutôt que double-cliquer sur l'icône de l'exécutable produit, si c'est le cas.

    La première chose dont il faut t'assurer est que DS pointe le bon segment de données. En l'occurrence, c'est le même que ton segment de code. Tu peux donc faire


    … en tête de code.

    Ensuite, tu peux ajouter une deuxième lecture de caractères après l'affichage du nom de l'utilisateur en fin de programme pour provoquer une pause.

    Enfin, on ne quitte pas un programme D.O.S. avec RET (sauf sur les TRÈS vieilles versions, et uniquement avec un programme *.COM, parce que le sommet de la pile était initialisé à 0000h, ce qui nous ramenait au début du PSP, qui lui-même débutait systématiquement par INT 20h), mais en appelant l'interruption adéquate, à savoir la fonction 4Ch de l'interruption 21h, et en mettant le code de retour dans AL, généralement 0. Donc :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            MOV     AX,4C00h
            INT     21h

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Quand j'ouvre le programme depuis une ligne de commande j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        [♣µ ╩♣¶ ↑ ╩♣        ♣               ═!╦
     
                 ♫▼║( ┤     ═!║T ┤
    ═!║= ┤      ═!║T ┤   ═!┤L═!┤
    ═!  Quel est v¶tre nom ?   ♣               ═!╦
     
                 ♫▼║( ┤     ═!║T ┤
    ═!║= ┤      ═!║T ┤   ═!┤L═!┤
     
                 ♫▼║( ┤     ═!║T ┤
    ═!║= ┤      ═!║T ┤   ═!┤L═!┤
    ═!  Quel est v¶tre nom ?
    WTF

    Voici mon code source amélioré (comme tu me l'as dit) :

    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
    28
    29
    30
    31
    32
    33
    34
    segment text
    PUSH CS
    POP DS
     
    MOV DX, mes1
    MOV AH,09h
    INT 21h
     
    MOV DX, int
    MOV AH, 0Ah
    INT 21h
     
    MOV DX, mes2
    MOV AH,09h
    INT 21h
     
    MOV DX, entree
    MOV AH,09h
    INT 21h
     
    mov ah,4Ch 
    INT 21h
     
    MOV AH, 0Ah
    INT 21h
     
    segment data
    mes1 db "Quel est votre nom ?", '$'
    mes2 db  13, 10, "Ah vous vous appelez", '$' 
     
     
    segment bss
    int db 100,0, 
    	times 100 db ($)
    Qu'est ce qui ne marche pas là dedans ?!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Ok, erreur de ma part. Code et données ne sont pas sur le même segment.

    Cela dit, il faut quand même initialiser le registre de segment DS en début de programme. Pour cela, il faudrait faire :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        mov ax,data
        mov ds,ax

    en début de programme à la place de « push cs ; pop ds » en début de programme. Mais, en faisant des tests sur NASM sous Linux, le compilateur se plaint, même avec la syntaxe « @data » d'antan. Pourtant, j'ai les bons flags.

    Essaie chez toi.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ça compile pas . Mais peux tu please me faire un code toi même pour le prog que j'essaie de réaliser ?

  6. #6
    Expert éminent sénior
    Avatar de JML19
    Homme Profil pro
    Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Inscrit en
    Décembre 2010
    Messages
    14 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2010
    Messages : 14 939
    Points : 23 253
    Points
    23 253
    Billets dans le blog
    10
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MOV DX, entree
    MOV AH,09h
    INT 21h
    cela ne va pas pour cet affichage, il faut ajouter un ligne de texte pointée par entree

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entree db "entree", '$'
    Ensuite il faut une gestion de chaque caractère entré au clavier.
    Vous pouvez utiliser les FAQ (ICI) ou les Tutoriels (ICI) et aussi accéder au blog (ICI)

  7. #7
    Expert éminent sénior
    Avatar de JML19
    Homme Profil pro
    Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Inscrit en
    Décembre 2010
    Messages
    14 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2010
    Messages : 14 939
    Points : 23 253
    Points
    23 253
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Voici un exemple de caractère entré au clavier avec mise en mémoire et vérification des touches.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    ;------------------------- entrée des données du fichier -----------------------
    entreF: mov ch,[id10] ;récupère la position du pointeur d'écriture
     
    entreC: mov ah,0
    int 16h ;entrée d'un caractère au clavier
    mov [bx],al ;place le code ascii du caractère dans id1
     
    suite2: cmp ah,01h ;compare le scan code avec la touche [ESC]
    jnz suite3 ;si vrai entrée d'un caractére
    jmp entreF
     
    suite3: cmp ah,1ch ;compare le scan code de la touche avec [enter]
    jnz suite4 ;si comparaison vraie crée le fichier
    jmp creeF
     
    suite4: cmp ah,0eh ;compare le scan code avec [back space]
    jnz suite5a ;si comparaison vraie efface le caractére
    jmp effC
     
    suite5a:cmp ah,0fh ;compare le scan code avec la touche TAB
    jnz suite5 ;si comparaison vraie entrée d'un caractère
    jmp entreF
     
    suite5: cmp ch,41 ;compare le nombre de caractères entré
    jnz suite6 ;si vrai attente de la touche [enter]
    jmp entreC
     
    suite6: mov [id5],bx ;sauve bx à l'adresse id5
    add bx,+1 ;additionne bx avec +1
     
    mov dl,al
    mov ah,02h ;affiche le caractère entré au clavier
    int 21h
     
    add ch,+1 ;additionne ch (nombre de caractères entré + 1)
     
    mov [id10],ch ;sauve la position du pointeur d'écriture
     
    mov ah,01h
    mov ch,6
    mov cl,7 ;modifie le curseur = (_)
    int 10h
     
    jmp entreF ;entrée d'un nouveau caractère
    ;-------------------------------------------------------------------------------
    Vous pouvez utiliser les FAQ (ICI) ou les Tutoriels (ICI) et aussi accéder au blog (ICI)

Discussions similaires

  1. Fenêtre tk active sans mettre le programme en pause
    Par nikaulas dans le forum Général Python
    Réponses: 5
    Dernier message: 08/01/2014, 12h04
  2. mettre un programme en pause
    Par Mydriaze dans le forum Général Python
    Réponses: 5
    Dernier message: 23/11/2012, 14h00
  3. Mettre le programme en pause en attendant un événement
    Par bigboss39 dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/04/2009, 15h10
  4. mettre un programme en pause
    Par jobherzt dans le forum C++
    Réponses: 16
    Dernier message: 13/07/2006, 20h38
  5. [NASM][x86] Boucle infinie
    Par poof65 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 07/11/2005, 17h39

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