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

Assembleur Discussion :

A propos d'un exercice au Tutoriel


Sujet :

Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut A propos d'un exercice au Tutoriel
    salut tout le monde
    D'abord je tiens à féliciter Benoît-M pour son tutoriel pour apprendre l'assembleur, il est parfait.
    Une fois j'ai lu le Tutoriel j'ai voulu faire les exercices proposés, mais comme je suis débutante en assembleur il y a certaines instructions dont j'arrive pas à comprendre l'intérêt. Par exemple, dans l'exercice où il s'agit de tester si un nombre positif est premier :
    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
    Procédure qui dit si un nombre positif (passé dans AX) est premier
     
    comment *
    		Procédure qui dit si un nombre positif est premier
    		Paramètres : AX = nombre à tester
    		Résultat : AX = 1 si le nombre est premier et 0 sinon
            *
    test_prem	proc	near
    		.386
    		pushf						;sauvegarde des flags
    		pusha						;sauvegarde des reg. généraux
    		push	ds					;sauvegarde de DS
     
    		cmp	ax, 2					;le nombre est-il < 2 ?
    		jb	TPnon_premier			;oui ? alors pas premier !
    		je	TPpremier				;si = 2 alors premier !
     
    		push	cs					;mettre cs
    		pop	ds					; dans ds
    		mov	word ptr ds:[TPsto_nombre], ax ;stocker le nombre à tester
    		mov	bx, 2					;on va le diviser par 2
    TPprochaine_div:
    		xor	dx, dx				;mettre DX à 0 pour la division
    		div	bx					;diviser DX:AX par BX
    		cmp	dx, 0					;pas de reste ?
    		je	TPnon_premier			;non ? alors pas premier !
    		mov	ax, TPsto_nombre			;restaurer le nombre dans AX
    		inc	bx					;on va diviser par le suivant
    		cmp	bx, ax				;si nouveau diviseur >= nombre
    		jae	TPpremier				; alors le nombre est premier !
    		jmp	TPprochaine_div			;sinon recommencer !
     
    TPnon_premier:
    		pop	ds					;restauration de DS
    		popa						;restauration des reg. généraux
    		popf						;restauration des flags
    		mov	ax, 0					;le nombre n'était pas premier
    		jmp	TPfini
     
    TPpremier:
    		pop	ds					;restauration de DS
    		popa						;restauration des reg. généraux
    		popf						;restauration des flags
    		mov	ax, 1					;le nombre était premier ;-)
     
    TPfini:
    		ret						;retour à l'appelant
     
    		;********** données ici **********
    TPsto_nombre	dw	?				;pour garder le nombre à tester
    test_prem	endp
    A vrai dire j'ai compris le principe et toutes les instructions mais je ne vois pas l'utilité de mettre le registre flag et les autres registres géneraux dans la pile ensuite les restaurer vers la fin, quelle en est l'utilité ?

    Ensuite pourquoi on a mis le registre CS dans la pile et on l'a mis dans DS ? ça sert à quoi s'il vous plait ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    push	cs   ;mettre cs
    		pop	ds  	; dans ds


    Merci beaucoup d'avance pour votre aide .

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Tout d'abord, à l'exception du retour éventuel d'un résultat dans un registre, une procédure restaure généralement l'environnement tel qu'il était avant son exécution, y compris le registre des flags.
    L'exemple que tu cites illustre bien la chose : tous les registres de l'ALU sont restaurés, le registre DS également (puisqu'il est modifié dans la procédure) ainsi que les flags. Le résultat est retourné dans le registre AX.

    Ensuite, la séquence
    est une manière très efficace de copier le contenu de CS dans DS, puisqu'aucune instruction ne permet de le faire directement.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup pour ta réponse, je comprends maintenant .

    J'ai encore une question, je sais que c'est bete mais bon je suis encore au début, je m'excuse à l'avance

    En fait sur quoi se base t-on pour le choix des registres à utiliser? est ce qu'il y a des astuces bien précises qui permettent de choisir un registre plutot qu'un autre??

  4. #4
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    En fait c'est avant tout une question de lisibilité ((co) maintenance).

    Si tu utilises des conventions qui sont les tiennes, la relecture par d'autres est rendue plus complexe, moins évidente.

    Il est donc recommandé de s'inspirer des utilisations standards:

    eax est très souvent modifié et est utilisé dans les (boucles) de copie.-> STOSD

    esi/edi la aussi, en tant que source et destination. -> MOVSD
    et ecx comme compteur. -> REP

    Les opérations comme DIV, utilisent le couple eax edx pour récupérer quotient et reste...

    etc. etc.

    Tu peux donc tous les utiliser, comme tu veux... mais à condition de rester logique pour les tiers

    @+WO

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup vous etes super

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

Discussions similaires

  1. [NumPy] Problème à propos d'un exercice sur image binaire
    Par i.Polo dans le forum Calcul scientifique
    Réponses: 8
    Dernier message: 16/05/2014, 02h10
  2. Problème à propos d'un exercice
    Par Kopp92i dans le forum Général Python
    Réponses: 3
    Dernier message: 04/11/2013, 03h23
  3. A propos de la série de tutoriels sur OpenGL 3.x
    Par Bakura dans le forum OpenGL
    Réponses: 12
    Dernier message: 06/07/2009, 11h14
  4. A propos de la série de tutoriels Interactive Raytracing
    Par Matthieu Brucher dans le forum Contribuez
    Réponses: 14
    Dernier message: 18/06/2009, 07h37
  5. [SQL] Cherche tutoriel & exercice utilisable en offline
    Par Seth77 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/10/2005, 18h34

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