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 :

Aide pour comprendre un code


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 Aide pour comprendre un code
    il s'agit d'un programme qui lit un nombre tappé au clavier et qui stocke le résultat dans une variable N1 (la lecture s'arrete qd le caractere tappé n'est pas un chiffre)

    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
     
    assume CS:Code, DS:Data
    Data Segment
    	N1 db ?
    Data Ends
     
    Code segment
    main:	mov AX,Data
    	Mov DS,AX
    	Mov N1,0
    lecture: mov AH,1 	; saisie
    	int 21h 	; le caractere lu arrive dans AL
    	Cmp AL, "0"
    	JB fin
    	Cmp AL,"9"
    	JA fin
    	Sub AL,"0" 	; sinon le chiffre= code ASCII-ASCII(0)
    	SHL N1,1 	; et N1 <- 10*N1 + AL
    	Mov BL,N1
    	SHL BL,1
    	SHL BL,1
    	Add N1,BL
    	Add N1,AL
    	jmp lecture
    fin: 	mov ah,4Ch
    	int 21h
    Code Ends
    End main
    j'ai tout compris à part cette portion là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    SHL N1,1 	; et N1 <- 10*N1 + AL
    	Mov BL,N1
    	SHL BL,1
    	SHL BL,1
    	Add N1,BL
    	Add N1,AL
    Pourquoi on a eu recours à BL ? je ne vois pas l'utilité de stocker N1 dans BL ensuite décaller ses bits deux fois vers la gauche... moi j'aurais programmé N1<-10*N1+AL comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SHL N1
    MOV N1,AL
    ADD N1,AL
    je sais que c'est faux mais je n'arrive pas à comprendre pourquoi

    Help please !

  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 : 49
    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,

    En fait, celui qui a ecrit ca se croyais encore sur un 8086 (peut-etre y etait-il encore remarque)
    sur les 8086 les multiplication sont tres gourmandes en cycles d'horloge
    alors qu'un decalage vers la gauche non.
    Du coup, pour faire une multiplication par 10, par exemple, si la valeur
    saisie est "7"
    on fait 7*2+7*8 ou plus exactement ici : 7*2 + (7*2)*4
    7*2 est realise par SHL N1,1
    en recupere 7*2 dans BL MOV BL,N1
    puis on fait un premier decalage de BL SHL BL,1
    un second... SHL BL,1
    et enfin on ajoute BL a N1 ADD N1,BL
    on a bien fait N1=N1*10

    Par la suite, avec les 386 puis les 486 et plus, ce genre d'optimisation ne
    sert plus a rien (voire meme le contraire)
    l'une des optimisation pour 486 consistait a "melanger" le code pour
    utiliser les pipelines.
    Cad de ne pas utiliser le meme registre dans 2 instructions a la suite

    dans ton exemple, la suite de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Sub AL,"0"
       SHL N1,1
       Mov BL,N1
    pouvait etre remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       SHL N1,1
       Sub AL,"0"
       Mov BL,N1
    ce qui permet de ne pas utiliser N1 2 fois dessuite sinon, le pipe ne servait
    a rien car le processeur devait attendre que SHL N1,1 soit fini avant de
    pouvoir commencer a traiter Mov BL,N1

    Et l'air de rien ce genre de petites modifs dans le code permettaient
    d'augmenter la vitesse d'un programme de 10 a 20 pourcent !

    voila !

    a+ Francois

  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
    Ah ouii !! maintenant je comprends le truc

    Merciiiiiiiiiiii François

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

Discussions similaires

  1. Aide pour comprendre un code
    Par Go'Gaule dans le forum Débuter
    Réponses: 5
    Dernier message: 23/07/2011, 17h08
  2. [AC-2007] besoin d'aide pour comprendre un code pour FTP trouvé sur le forum
    Par tibofo dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/04/2010, 20h03
  3. aide pour comprendre un code
    Par ranell dans le forum C++
    Réponses: 5
    Dernier message: 28/04/2009, 08h34
  4. Besoin d aide pour comprendre un code
    Par litlebasic dans le forum Delphi
    Réponses: 4
    Dernier message: 22/06/2006, 13h00
  5. Aide pour comprendre le code
    Par jfreuff dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/01/2006, 17h54

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