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 :

Petit problème de boucle


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Petit problème de boucle
    Bonjour,

    j'ai un problème, je suis débutant en assembleur ( pour ne pas dire nul ).
    Le code qui va suivre contient vraiment des éléments de base
    ( Afficher - Lire - Afficher - Boucle )


    Pour commencer, voilà les détails requis
    _ Machine : PC
    _ Processeur : 8086
    _ Compilateur : AS ( GNU Compiler )
    _ OS : Debian 5


    Ensuite, voilà le problème exact : boucle infinie.
    En fait, je ne comprend pas bien comment on peut (ici, dans la boucle) utiliser plusieurs choses différentes avec les registres.
    Car à 1ère vue, mon problème est mon essai (en vain) d'afficher la variable "varb" à chaque incrémentation. Et les commandes d'affichage que j'ai tenté de mettre ont l'air de changer la valeur de la variable..

    Peut-être que c'est les limites de ce genre de chose et qu'il faut utiliser ensuite la pile ( désolé si je dis des conneries ^_^ )
    M'enfin ceci est mon (gros) problème

    Pour finir, le 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
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    .globl _start
            .data
     
    text:    .asciz    "Bienvenue dans le programme de test !\n"
    input:    .space    15
    bcl:    .asciz    "Boucle terminee"
    valb:    .byte    10
    valh:    .byte    20
     
     
            .text
        _start:
     
    txt_bienvenue:
            movl    $39, %edx    /* Taille de la chaine */
            movl    $text, %ecx    /* Adresse de la chaine */
            movl    $1, %ebx    /* Appel : Ecran */
            movl    $4, %eax    /* Appel : Afficher */
            int    $0x80        /* Appel systeme */
     
    input_texte:
            movl    $15, %edx
            movl    $input, %ecx
            movl    $1, %ebx
            movl    $3, %eax
            int    $0x80
     
    output_texte:
            movl    $15, %edx
            movl    $input, %ecx
            movl    $1, %ebx
            movl    $4, %eax
            int    $0x80
     
    init_boucle:
            movl    $valh, %ecx
            movl    $valb, %edx
     
    boucle:
            cmp    %ecx, %edx
            je    fin_boucle
            inc    %edx
     
            movl    $2, %edx
            movl    $valb, %ecx
            movl    $1, %ebx
            movl    $4, %eax
            int    $0x80
     
            jmp boucle
     
    fin_boucle:
            movl    $15, %edx
            movl    $bcl, %ecx
            movl    $1, %ebx
            movl    $4, %eax
            int    $0x80
     
    quitter:
            movl    $0, %ebx    /* Code de retour sans erreur */
            movl    $1, %eax    /* Appel : Sortir */
            int    $0x80        /* Appel systeme */

    Cordialement,
    Valentin.

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    Bonjour valx76,
    C'est un peu normal que ça boucle à l'infinie. Regarde :
    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
     
            movl    $valh, %ecx
            movl    $valb, %edx
     
    boucle:
            cmp    %ecx, %edx
            je    fin_boucle
            inc    %edx
     
            movl    $2, %edx
            movl    $valb, %ecx
            movl    $1, %ebx
            movl    $4, %eax
            int    $0x80
     
            jmp boucle
     
    fin_boucle:
    Tu utilies les valeurs contenus dans ECX et EDX pour tester la fin de ta boucle. Ce qui est normal. Mais après, tu détruis le contenu de ces registres avec l'interruption. Donc, il faut sauvegarder le contenu de ces registres, avant l'interruption, puis les restaurer après. L'utilisation de la pile est une excellente idée, vu le peu de registres que possèdent les processeurs x86. Donc voilà ce qu'il faudrait faire :

    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
     
            movl    $valh, %ecx
            movl    $valb, %edx
     
    boucle:
            cmp    %ecx, %edx
            je    fin_boucle
            inc    %edx
     
            pushl   %ecx
            pushl   %edx
            movl    $2, %edx
            movl    $valb, %ecx
            movl    $1, %ebx
            movl    $4, %eax
            int    $0x80
            popl     %edx
            popl     %ecx 
     
            jmp boucle
     
    fin_boucle:
    Je pense que là, ça devrait aller.

    Tommy

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour Tommy.

    Alors déjà un grand merci pour ta réponse, je crois que ça m'a pas mal éclairé pour la pile ( je me posais beaucoup de questions à ce sujet )

    Donc tout marche maintenant sauf une seule chose.
    [[ Mais au moins j'ai compris le fonctionnement, c'est une grande avancée lol ]]

    En fait il marque "Boucle terminee" donc c'est bon, mais en revanche, je ne vois pas les valeurs de "valb". J'ai juste un blanc, rien quoi

    M'enfin déjà encore merci

    Valentin

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    La fonction n°4 de l'interruption 0x80 permet uniquement d'afficher des chaînes de caractères, pas des nombres. Il est donc normal que tu n'obtiennes rien. Il te faut donc écrire une routine permettant de convertir un nombre en une chaîne de caractères, puis de l'afficher ensuite.

    Tommy

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon..
    J'ai cherché dans pleins de listes de routines / syscall / interruptions.
    RIEN

    J'ai aussi cherché quelque chose de conversion comme tu l'as dit mais sans succès non plus..

    Je désespère lol

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Via,
    Citation Envoyé par valx76 Voir le message
    Bon..
    J'ai cherché dans pleins de listes de routines / syscall / interruptions.
    RIEN

    J'ai aussi cherché quelque chose de conversion comme tu l'as dit mais sans succès non plus..

    Je désespère lol
    C'est le moment d'apprendre à faire ça (il en a souvent été question sur ce forum).
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Petit problème avec boucle DO
    Par mathilde13870 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/04/2014, 16h39
  2. [AC-2003] Petit problème de boucle !
    Par Plume27 dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/01/2013, 15h51
  3. Petit problème de boucle
    Par fouedou77 dans le forum C
    Réponses: 19
    Dernier message: 26/06/2009, 13h00
  4. Petit problème de boucle
    Par [root@127.0.0.1]~# dans le forum Langage
    Réponses: 4
    Dernier message: 03/05/2009, 22h28
  5. ASP petit problème à propos sur une boucle if
    Par nicodu59 dans le forum ASP
    Réponses: 2
    Dernier message: 02/08/2007, 10h21

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