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 :

Erreur de segmentation


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut Erreur de segmentation
    Bonjour à tous ,
    je commence les challenges du site ProjectEuler , en asm ...
    Là je dois trouver la somme de tout les multiples de 3 et 5 en dessous de 1000:

    Voici mon programme
    Code asm : 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
    extern printf
     
    section .text
    	global main
     
    main:
     
    	mov ecx,3
     
    	mov esi,3
    	mov edi,5
     
    	xor ebx,ebx ; sum 
     
    boucle:
    	mov eax,ecx
    	xor edx,edx
    	div esi
    	test edx,edx 
    	je yes
     
    	mov eax,ecx
    	xor edx,edx
    	div edi
    	test edx,edx
    	jne no
     
    	yes:
    		add ebx,ecx
    	no:		
    		inc ecx
    		cmp ecx,1000
    		jne boucle
     
    	finboucle:
    		leave 
    		ret

    Cependant j'ai une erreur de segmentation , elle apparait dans le "no" lorsque j'incrémente ecx , je ne comprends vraiment pas pourquoi ...

    Merci de votre aide d'avance !



    EDIT : finalement ça venait du "leave" et "ret" qui servent en fait à quitter une fonction et non le programme , si j'ai bien compris .
    je les ai remplacés par
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	mov eax,1
    	mov ebx,0
    	int 0x80

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par Neolex Voir le message
    EDIT : finalement ça venait du "leave" et "ret" qui servent en fait à quitter une fonction et non le programme , si j'ai bien compris .
    Oui et plus précisément, LEAVE sert à le faire en purgeant le cadre de pile instauré par ENTER.

    Par contre, je ne vois pas pourquoi tu t'embêtes à faire une division (et même deux) : à partir du moment où tu passes en revue tous les nombres de 1 à 1000 dans une boucle, autant incrémenter deux autres compteurs en parallèle. À chaque fois que le premier atteint 3 et/ou que le second atteint 5, tu le remets à zéro et tu additionnes à la valeur en cours à ton sous-total.

    C'est plus simple, ça risque d'être au bas mot dix fois plus rapide et l'algorithme est portable sur des processeurs plus modestes (les porduits qui implémentent pleinement la division sont peu nombreux car c'est une opération beaucoup plus complexe que les trois autres).

  3. #3
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    À chaque fois que le premier atteint 3 et/ou que le second atteint 5, tu le remets à zéro et tu additionnes à la valeur en cours à ton sous-total.
    Je ne comprends pas ce que vous voulez dire ... qu'est ce que " le premier" ?


    Merci de votre aide .

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    L'incrémentation et la comparaison avec zéro sont des opérations fondamentales en assembleur et en électronique numérique : elles existent partout parce qu'elles sont à la fois très simples à mettre en place et que c'est sur elles que reposent toutes les autres (ou la majeure partie). C'est spécialement vrai avec les architectures RISC.

    Si tu passes déjà en revue les entiers naturels les un après les autres, il n'est pas nécessaire de faire une opération dessus pour savoir s'ils sont en soi multiples ou non d'une valeur donnée. Il suffit d'incrémenter un autre compteur en parallèle « 0, 1, 2, 3, 4… 0, 1, 2, 3, 4… 0, 1, 2, 3, 4… ». Chaque fois que ce compteur arrive à cinq, tu sais que tu as atteint un multiple de cinq. Tu fais le traitement qui t'intéresse et tu remets ce compteur à zéro avant de poursuivre ta boucle.

  5. #5
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Merci , j'ai compris , je vais essayer de faire ça quand j'aurais réussi à afficher le résultat d'abord .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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