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 :

[x64] Boucle infinie


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    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 : 11
    Points : 5
    Points
    5
    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
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    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
    Futur Membre du Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    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 : 11
    Points : 5
    Points
    5
    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 éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    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
    Futur Membre du Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    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 : 11
    Points : 5
    Points
    5
    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
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 433
    Points : 43 062
    Points
    43 062
    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 le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    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 : 11
    Points : 5
    Points
    5
    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 éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    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
    Futur Membre du Club
    Femme Profil pro
    Epitech Paris
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    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 : 11
    Points : 5
    Points
    5
    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 éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    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 Entrée/Sortie
    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