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 :

nasm division d'un nombre en facteur de nombre premier


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 12
    Points
    12
    Par défaut nasm division d'un nombre en facteur de nombre premier
    Je dois réaliser l'équivalent de la commande factor en assembleur nasm.


    Voila ce que j'ai effectué pour le moment (j'ai pris comme valeur pour essayer 10):
    Le problème est que mon dernier diviseur vaut 0, ce qui n'est pas cohérent... (j'ai déroulé mon algo sur papier et il y a pas de soucis).
    Je pense que ça doit venir du fait que j'utilise push, et pop. (Je ne maitrise pas trop la pile...).
    Par ailleurs j'ai fait un affichage de eax dans division pour tester une fois avant celui de ebx et une fois apres et la encore je trouve 2nombres différents. (10 lorsque je le fais avant, et sinon 3). Le premier affichage de ebx s'effectue par contre correctement. On affiche bien 2.
    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
     
    SECTION .data
    		extern printf
    		global debug
    		msg db ' %d',10,0
    		msg2 db 'dernier diviseur => %d',10,0
     
    SECTION .text
    debug:
    		mov eax, [esp + 4] 	; notre nombre n est dans eax
    		mov ebx,2		; on commence notre recherche par le premier nombre premier
    		jmp debut
     
    debut:		
    		cmp eax,ebx
    		je fin			; si les 2nombres sont egaux rien a faire je = jump if equal
    		cmp ebx,eax		; si diviseur 
    		jng boucle		; < a notre nombre alors on commence a cherche les facteurs
    		jmp fin
     
    boucle:
    		div ebx			; on divise eax par ebx
    		mov ecx,edx		; on recupere le reste dans ecx
    		mul ebx			; on remet n (eax) a sa valeur de depart
    		add eax,ecx		; on ajoute le reste de la division qui manqué
    		mov edx,0		; pour tester si le reste est egal a 0
    		cmp ecx,edx		; si le reste est egal a 0 on a trouve un facteur premier
    		je division		; on continue donc
    		inc ebx			; sinon on incremente ebx
    		jmp debut		; et on recommence la boucle
     
    division:
    		push ebx		; on affiche le premier facteur premier qui est ebx
    		push msg
    		call printf
    		pop ebx
    		div ebx
    		mov ebx,2		; la division a marché on remet le diviseur a 2
    		jmp debut		; on retourne au debut
     
    fin:
    		push eax
    		push msg2
    		call printf          ; on affiche le dernier diviseur

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Il faut savoir que printf modifie le registre eax (en effet, c'est ce registre qui est utilisé pour retourner la valeur d'une fonction), donc il faut penser à remettre la valeur initiale dans eax après ton appel de fonction (ou changer de registre).
    Aussi, pense à nettoyer la pile après un printf (ça t'évitera des segfault bizarres)

    A part cela, ton algorithme semble être correct.
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Oui quand j'ai rendu mon projet c'est ce que le prof m'a réexpliqué.
    Que par convention s'il une fonction retourné quelque chose c'était dans eax... d'où mon printf bizarre. Et qu'en effet il fallait déplacer le pointeur de pile après printf.

    Merci pour ton message

Discussions similaires

  1. nasm division signé
    Par zakuza dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 19/03/2012, 20h54
  2. Réponses: 5
    Dernier message: 05/05/2007, 15h25
  3. Réponses: 52
    Dernier message: 13/03/2007, 15h07
  4. nombre d'enregistrements ou nombre de table ?
    Par grinder59 dans le forum Administration
    Réponses: 3
    Dernier message: 26/08/2006, 00h51
  5. Réponses: 4
    Dernier message: 24/04/2006, 11h44

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