Discussion: [x64] Boucle infinie

  1. #1
    Candidat au Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 21
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Epitech Paris
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2016
    Messages : 10
    Points : 4
    Points
    4

    Par défaut [x64] Boucle infinie

    Bonjour,

    Je débute avec le langage Assembleur, j'aimerais faire une boucle qui affiche 5 fois "hello world!".

    Voici mon 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
     
    global  my_strlen                                                                                                                                                                     
     
            section .data                                                                                                                                                                        
     
            msg db      "hello, world!", 10                                                                                                                                                      
     
            section .text                                                                                                                                                                        
     
    my_strlen:                                                                                                                                                                                   
            enter 0,0                                                                                                                                                                            
            mov rcx, 0                                                                                                                                                                           
            jmp loop                                                                                                                                                                             
     
    loop:                                                                                                                                                                                        
            cmp rcx, 5                                                                                                                                                                           
            jne _increment                                                                                                                                                                       
            leave                                                                                                                                                                                
            ret                                                                                                                                                                                  
     
    _increment:                                                                                                                                                                                  
            inc rcx                                                                                                                                                                              
            jmp hello                                                                                                                                                                            
     
     
    hello:                                                                                                                                                                                       
        mov     rax, 1                                                                                                                                                                           
        mov     rdi, 1                                                                                                                                                                           
        mov     rsi, msg                                                                                                                                                                         
        mov     rdx, 14                                                                                                                                                                          
        syscall                                                                                                                                                                                  
            jmp loop
    Cependant j'ai un problème, la boucle ne s'arrête jamais... Pourtant j'incrémente bien rcx, je ne trouve pas mon erreur.

    Quelqu'un peut m'aider svp ?

    Cordialement,

  2. #2
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 674
    Points : 1 883
    Points
    1 883

    Par défaut

    Salut,

    T'es sûr que ton syscall ne modifie par la valeur de rcx ?
    essaye d'utiliser une variable à la place pour voir...

  3. #3
    Candidat au Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 21
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Epitech Paris
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2016
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Quand j'utilise une variable j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my_strlen.s:15: error: invalid combination of opcode and operands
    my_strlen.s:21: error: invalid combination of opcode and operand
    Voici mon 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
     
            global  my_strlen                                                                                                                                                                     
     
            section .data                                                                                                                                                                         
     
            msg db  "hello, world!", 10                                                                                                                                                           
            i db    0                                                                                                                                                                             
     
            section .text                                                                                                                                                                         
     
    my_strlen:                                                                                                                                                                                    
            enter 0,0                                                                                                                                                                             
            jmp loop                                                                                                                                                                              
     
    loop:                                                                                                                                                                                         
            cmp i, 5                                                                                                                                                                              
            jne _increment                                                                                                                                                                        
            leave                                                                                                                                                                                 
            ret                                                                                                                                                                                   
     
    _increment:                                                                                                                                                                                   
            inc i                                                                                                                                                                                 
            jmp hello                                                                                                                                                                             
     
     
    hello:                                                                                                                                                                                        
            mov rax, 1                                                                                                                                                                            
            mov rdi, 1                                                                                                                                                                            
            mov rsi, msg                                                                                                                                                                          
            mov rdx, 14                                                                                                                                                                           
            syscall                                                                                                                                                                               
            jmp loop

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    .
    Inscrit en
    mai 2010
    Messages
    1 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : mai 2010
    Messages : 1 835
    Points : 4 836
    Points
    4 836

    Par défaut

    Cela aurait pu marcher (sur un autre assembleur) , mais les programmes assembleur ont tous leur propre syntaxe pour représenter les valeur immédiate/adresse , donc j'imagine que en x86 la syntaxe habituelle serait plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _increment:                                                                                                                                                                                   
            inc [i]
    (en étant tjs sur de rien faudrait vraiment que je me remette un peu en x86 un jour :p ).

    C'est vraiment un exo d'école ?

  5. #5
    Candidat au Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 21
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Epitech Paris
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2016
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    J'ai toujours le même message d'erreur :/

    Non, mon exercice consiste à recoder un strlen en asm, cependant il boucle inf a cause de l'incrémentation qui ne marche pas, alors j'ai voulu essayer avec des "hello world" ^^

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 6 288
    Points : 12 973
    Points
    12 973

    Par défaut

    Regardes ce POST, prob similaire :
    https://www.developpez.net/forums/d1...lt-strlen-asm/
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Candidat au Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 21
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Epitech Paris
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2016
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Merci beaucoup pour le lien, mais avant de continuer mon strlen, j'aimerai savoir pourquoi cette boucle ne marche pas ... ça fait maintenant deux jours que bloque dessus ...

  8. #8
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    .
    Inscrit en
    mai 2010
    Messages
    1 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : mai 2010
    Messages : 1 835
    Points : 4 836
    Points
    4 836

    Par défaut

    tu peux mettre inc i et cmp i,5 en commentaire ? pour voir si ça vient d'eux le souci ?
    (enfin sauf si l'erreur vient vraiment des labeld mais ça m'étonnerait bcp ).

  9. #9
    Candidat au Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 21
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Epitech Paris
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2016
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Sans ces deux lignes, le programme s'arrête sans afficher un seul "Hello World!", ce qui est totalement logique.

  10. #10
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    .
    Inscrit en
    mai 2010
    Messages
    1 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : mai 2010
    Messages : 1 835
    Points : 4 836
    Points
    4 836

    Par défaut

    Pour voir si la compilation fonctionne , pas l’exécution

    ça fait maintenant deux jours que bloque dessus ...
    Ton souci n'est qu'un souci de syntaxe en deux jours tu aurait pu trouver la bonne syntaxe (mais je ne rechercherais pas a ta place ) ,il faut tous simplement regarder sur comment on écrit sur une adresse , inc i peut être valide sur certain assembleur pareil pour inc [i] , sur NASM ça marche.
    Il n'y a pas de convention en asm ni une syntaxe universel , chaque assembleur fourni leur propre syntaxe (même s'il reste très ressemblant dans les grandes lignes).

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum IO
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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