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

Autres architectures Assembleur Discussion :

ROR rotate left et machine microprogrammée


Sujet :

Autres architectures Assembleur

  1. #21
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 24
    Points : 2
    Points
    2
    Par défaut Mul
    Quand je prends 4 bits c'est à titre d'exemple, c'est plus simple.



    a+

  2. #22
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    ça ne change rien... l'algo reste le même.

  3. #23
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 24
    Points : 2
    Points
    2
    Par défaut Mul
    Tq B pair
    Decal A gauche
    Decal B droite
    Fin tq
    Si B impair
    A=A+Ainit
    decal B droite

    Cela ne fonctionne pas ci-dessous le contre exemple
    A | B
    ______
    7 | 10
    14 | 5
    21 | 4
    42 | 2
    84 | 1
    91 | 0

    J'ai également essayé en faisant B=B-1 (lorsque B impair) mais cela ne fonctionne pas non plus.

    a+

  4. #24
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    il manque quelque(s) chose(s) non ?

    Si tu décales vers la droite tes bits, ils perdent aussi leur poids et pourtant la multiplication (rotation) a toujours le même poids : 2 ...

    et puis ce n'est pas tout...

  5. #25
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 24
    Points : 2
    Points
    2
    Par défaut ROR et MUL
    un indice ??

    Je t'avoue que je sèche, là...

    a+

  6. #26
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    C'est pas les algos qui manquent, un relativement simple et adapté à ce que tu sais faire : SHL/SHR donc 35 * 19 = 665
    Tu as compris le problème avec le traitement des "poids" impairs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A  B  C
    35 19 19
    17 38 38
    8  76 --
    4 152 --
    2 304 --
    1 608 608 
          665
    Le multiplicande et le multiplicateur sont placés respectivement en A et en B. Dans la colonne A, on inscrit la partie entière des quotients successifs de la division par 2 jusqu'à l'unité. Dans la colonne B, on inscrit les produits successifs de la multiplication par 2. Dans la colonne C on reporte les nombres de B qui sont associés à un nombre impair en A. La somme des nombres de la colonne C est le produit de 35 × 19, soit 665.

  7. #27
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 24
    Points : 2
    Points
    2
    Par défaut Mul
    Celà a l'air de fonctionner je vais le tester ce soir avec des exemples et je te dirais si celà fonctionne.

    Merci.

    Mais tu fais quoi comme taf, tu programmes en assembleur ?

    a+

  8. #28
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    chut...

  9. #29
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 24
    Points : 2
    Points
    2
    Par défaut Mul
    Voici l'algo qui irai avec ton exemple
    Tq B pair
    DCAL A gauche
    DCAL B droite
    Ftq
    Si B impair
    C=C+A
    DCAL A gauche
    DCAL B droite
    Ftq

    Mon pb maintenant est que je n'ai que 2 registres où je puisent stocker des valeurs AC et RDO.

    Donc je ne crois pas que celà fonctionne avec ma machine.

  10. #30
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Il me semble, mais avec l'age... que tu inverses les rotations A/B ?

    Es-tu sûr d'être obligé de stocker, tu ne peux pas tester / addition si LSBit 1 :

    En évitant les boucles et en déroulant le code comme d'hab.

    Si AND A 00 01 hex -> ADD (C) A
    SHL B 1
    SHR A 1

    Si AND A 00 01 hex -> ADD (C) A
    SHL B 1
    SHR A 1

    etc...

    Pas moyen d'économiser du registre ?

    Pas de pile disponible dans laquelle tu pourrais push/pop C ?

    Pas de MAJs de flag disponibles non plus ?

    N'importe comment si le problème à été posé c'est que c'est possible
    De plus, croire qu'il existe une solution c'est être assuré de trouver tôt ou tard (si si).

  11. #31
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    je ne sais pas ci cela t´aideras
    ROR
    move les bits d'operando1 une position vers la droite, y compris le carry.
    Dans le bit 7 on chargera ce que nous avons en C.
    En C on chargera le bit 0.

    1.- Hacemos ROR 27
    -Si hay carry 1001 1101
    -Si NO hay carry 0001 1101
    ror-> rota a la droite -> met le carry x la gauche
    2.- Hacemos ROL 27
    -Si hay carry 0111 0101
    -Si NO hay carry 0111 0100
    rol-> rota a la gauche -> met le carry x la droite

  12. #32
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    C'est peut-être une très bonne solution si cela ne t'oblige pas à rajouter des tests supplémentaires.

  13. #33
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    Pas 0
    multiplication de 1 x 1 byte
    donc le résultat sera de 2 bytes
    donc dans un registre nous chargeons le multiplicateur
    et dans un autre le multipliant comme le multipliant nous allons roté
    en déplaçant bit à bit vers la gauche nous avons besoin d'avoir un autre registre à 0.
    Par conséquent nous aurons en commençant
    Multiplicando = 00000000 01111011 (dos bytes, 16 bits, dos registros)
    Multiplicador = 10100101
    Resultado = 00000000 00000000
    Ils seront maintenant 8 rondes, parce qu'on fait 8 multiplications (8 x 8 bits bits)
    Ronda 1

    C'est une multiplication, donc nous multipliions normalement :
    Code:
    01111011 7B Multiplicando deux registres
    x 10100101 A5 MULTIPLICADOR
    -----------------
    0000000001111011
    Dans cette ronde nous avons multiplié le MULTIPLICADOR par 1,
    puisque c'est le bit qui reste plus à droite du multiplicateur
    égal que en décimale de toute la vie
    La meilleure façon de le savoir est de roté le MULTIPLICADOR à droite
    avec l'instruction LSR alors aurons que le bit0 de du MULTIPLICADOR
    passe au carry et dans le bit7 du MULTIPLICADOR on place un 0
    par conséquent le MULTIPLICADOR reste ainsi 01010010 - Carry - 1.
    comme c´est 1 il faut ajouter, parce que nous ajoutons le multipliant au résultat.
    Mais tu ne dois pas directement ajouter parce que tu sais déjà qu'il est un 1
    pour cela tu utilises une instruction
    de telle sorte que si cést un 1 tu somme et si c´est un 0 non
    MULTIPLICADOR = 01010010
    puisque nous l'avons roté à droite, il se sont déplacé tout les bits une position
    Multiplicando= 00000000 01111011
    Resulta .....= 00000000 00000000
    Sumamos Multiplicando + Resultado:
    Nuevo resultado = 00000000 01111011

    Avant de sortir de cette ronde on rote le Multiplicando à gauche pour avoir
    ce qui est déjà préparé pour la ronde suivante
    et par conséquent le Multiplicando maintenant
    Multiplicando= 00000000 11110110
    Pour roté le Multiplicando un bit à gauche
    au byte lsb du Multiplicando et un rol au byte msb on obtient puisque
    byte bas LSB = 01111011
    byte haut MSB = 00000000

    - LSL byte bas est roté à gauche le registre avec ce que le bit7 passe au carry
    et dans le bit0 est placé un 0
    par conséquent il reste le byte bas après le LSL 11110110 et dans le carry
    nous aurons le 0 qui etait avant dans le bit 7, par conséquent Carry=0
    - ROL byte haut c´est roté à gauche le registre le bit7 passe au carry
    (qu'il nous donne égal où il va)
    et dans le bit0 se met el bit que etait dans le carry
    qui est un 0 parce que carry prend la valeur du bit7 du byte bajo en lui faisant le LSL
    par conséquent en enchaînant ces deux instructions tu obtiens que le bit7
    du byte bas passe au bit0 du haut byte.
    Si tu prends le multiplicando comme 2 bytes (16 bits) tu passe le bit7 au bit8.
    Il reste par conséquent le haut byte après le ROL 00000000 Et
    le multiplicando complet reste 00000000.11110110 ce que lons cherche
    Ronda 2
    Code:
    0000000011110110 ->tras ronda anterior
    x 01010010 ->tras ronda anterior
    -----------------
    0000000001111011
    0000000000000000 +
    -----------------
    0000000001111011
    Nous faisons le même processus : on rote le multipliant à droite -> 00101001 C-> 0
    le bit0 est passé au carry
    s'il est zéro il ne faut pas ajouter rien
    il foudrais lui ajouter 00000000.00000000 puisqu'il est de multiplier par 0
    et il est la même chose que n'ajouter rien par conséquent nous ne faisons rien
    avant de sortir on rote de nouveau le multipliant à gauche avec le ROL LSL
    MULTIPLICADOR = 00101001 puisque ont la roté a la droite
    ont a deplacé tout les bit a droite une posicion
    Multiplicando= 0000000 111101100
    Résultat est encore ce dernier nous n'avons pas ajouté 00000000.01111011
    Ronda 3
    Code:
    0000000111101100 ->tras ronda anterior
    x 00101001 ->tras ronda anterior
    ----------------
    0000000001111011
    0000000000000000
    0000000111101100 +
    -----------------
    0000001001100111
    Nous faisons le même processus : on rote le multipliant à droite -> 00010100 C-> 1 el bit0
    et nous voyons qu'il est 1
    il est passé au carry donc nous le contrôlions avec les ins brcc ou brcs
    par conséquent il faut ajouter le multipliant comme ce plus le résultat accumulé
    Multiplicando 00000001 11101100
    Resultat .....00000000 01111011
    on calcule
    Nouveau resultat 00000010 01100111
    avant de sortir on rote de nouveau le multipliant à gauche avec le ROL LSL
    Multiplicando 00000011 11011000
    MULTIPLICADOR 00010100 puisque ont la roté a la droite
    ont a deplacé tout les bit a droite une posicion
    Ronda 4
    Code:
    0000001111011000 ->tras ronda anterior
    x 00010100 ->tras ronda anterior
    ----------------
    0000000001111011
    0000000000000000
    0000000111101100
    0000000000000000 +
    ----------------
    0000001001100111
    Nous faisons le même processus : on rote le multipliant à droite
    -> 00001010 C-> 0 le bit0 est passé au carry
    s'il est zéro il ne faut pas ajouter rien
    Multiplicando 00000111 10110000
    MULTIPLICADOR 00001010
    resultat na pas varié 00000010 01100111
    Ronda 5
    Code:
    0000011110110000 ->tras ronda anterior
    x 00001010 ->tras ronda anterior
    ----------------
    0000000001111011
    0000000000000000
    0000000111101100
    0000000000000000
    0000000000000000 +
    ----------------
    0000001001100111
    Nous faisons le même processus : on rote le multipliant à droite
    -> 00000101 C-> 0 le bit0 est passé au carry
    s'il est zéro il ne faut pas ajouter rien
    Multiplicando 00001111 01100000
    MULTIPLICADOR 00000101 puisque ont la roté a la droite
    resultat na pas varié 00000010 01100111
    Ronda 6
    Code:
    0000111101100000 ->tras ronda anterior
    x 00000101 ->tras ronda anterior
    ----------------
    0000000001111011
    0000000000000000
    0000000111101100
    0000000000000000
    0000000000000000
    0000111101100000 +
    ----------------
    0001000111000111

    Nous faisons le même processus : on rote le multipliant à droite
    -> 00000010 C-> 1
    et nous voyons qu'il est 1
    il est passé au carry donc nous le contrôlions avec les ins brcc ou brcs
    par conséquent il faut ajouter le multipliant comme ce plus le résultat accumulé
    Multiplicando 00001111 01100000
    Resultat 00000010 01100111
    on calcule
    Nouveau resultat 00010001 11000111
    avant de sortir on rote de nouveau le multipliant à gauche avec le ROL LSL
    Multiplicando 00011110 11000000
    MULTIPLICADOR 00000010 puisque ont la roté a la droite
    ont a deplacé tout les bit a droite une posicion

    total serait 8 rondes

    Toutes ces rondes peuvent être résumées une boucle de cette manière plus ou moins
    Code :
    Inicializon registres (ce qui est qui serait le pas 0)
    en en tenant compte du fait que nous devons en outre habiliter un registre
    comme comptable de rondes
    Boucle :
    Rotamos MULTIPLICADOR à droite
    Contrôlons carry -
    Si C=1 nous sautons alors ajouter en multipliant + résultat -
    Si C=0 nous sautons roté en multipliant
    Saut d'ajouter en multipliant + résultat et suit
    Saut de roté à gauche le multipliant
    Decrementamos comptable de rondes avons terminé ?
    si nous n'avons pas terminé nous suivons dans la boucle
    Si nous avons terminé FIN
    jai fait mon possible pour faire la traducion de la meilleure facon possible

  14. #34
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    voila je te montre un exemple avec un micro avr
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    ;------------------------------------------------------ 
    ; FICHERO: ejercicios.asm 
    ; La multiplicación será esta :7B * A5
    ; 7B * A5 = (123 * 165) = (0111 1011* 1010 0101)= 4F47 (20.295) 
    ;------------------------------------------------------ 
    ; Declaraciones estandar para este micro AT90S8515: 
     .include "8515def.inc" 
    ;----------------------------------------------------------- 
    ; Definicion de constantes y variables 
    ; -------------------------------------------------------- 
    ; Pila
      .equ          PILA                   =0x0FF 
    ;-----------------------------------------------------            
    .DSEG        
    ; MEMORIA RAM        
         .ORG                (PILA+1) 
    ;---------------------------------------------------- 
    ;            Vectores de interrupcion 
    ;----------------------------------------------------            
     .CSEG        
        .ORG     0x0000         
     rjmp        RESET                        ; RESET 
    ; -------------------------------------------------------- 
    ;                       RUTINA DE RESET 
    ; -------------------------------------------------------- 
    RESET:  cli
            ldi        r16,HIGH ( PILA )         
     out        SPH,r16         
     ldi        r16,LOW (PILA )                          
     out        SPL,r16         
    ;*******DESDE AQUÍ VUESTRO CODIGO**** 
    clr r16
    clr r20
    ldi r18,0x7B
    ldi r19,0xA5
    ldi r16,0x08
    cpi r16, 0x00
    brcc Sumo 
    Sumo:
    cpi r16, 0x00
    brlt Fin
    ror r20    
    ror r19    
    dec r16
    brcs Sumo1
    brcc Sumo
    Sumo1:
    add r20,r18
    ror r20
    ror r19
    dec r16
    brcc Sumo
    brcs Sumo1
    Fin:
    rjmp   STOP        
     
    ;****HASTA AQUÍ VUESTRO CODIGO******** 
     
    STOP:        rjmp        STOP   ;FIN DEL PROGRAMA

  15. #35
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Humm... tu n'as pas oublié quelque chose (d'assez limitatif) dans le problème ?

    PS: Quand tu édites tes message, une option en haut de page te permet d'effacer...

  16. #36
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    On suppose que le nombre est dans le registre A et que les deux instructions shift
    procèdent logiquement au sens où c'est un 0 qui est injecté dans le premier latch
    selon le sens du shift : 0->b0->b1->b2->b3 ou 0->b3->b2->b1->b0

    Ne connaissant pas à priori les mouvements possibles entre les registres, l'idée
    est la suivante :

    ROL

    B = A ; sauvegarde du nombre
    A >> ; shift à droite trois fois pour placer le b3 en b0
    A >>
    A >>
    C = A ; sauvegarde du b3
    A = B ; rappel du nombre
    A << ; shift à gauche : le b3 disparait
    B = A ; sauvegarde du resultat
    A = C ; rappel du b3
    A + B ; ajouté au autres bits pour réaliser le ROL


    ROR

    B = A ; sauvegarde du nombre
    A << ; shift à gauche trois fois pour placer le b0 en b3
    A <<
    A <<
    C = A ; sauvegarde du b0
    A = B ; rappel du nombre
    A >> ; shift à droite : le b0 disparait
    B = A ; sauvegarde du résultat
    A = C ; rappel du b0
    A + B ; ajouté aux autres bits pour réaliser le ROR

    Si le shift injecte un 1 il faut faire un NOT sur le nombre à l'entrée de processus
    et à la fin.

    Si le shift à droite préserve le bit de poids fort (arthmétique) alors là...

    A plus !

  17. #37
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Juste histoire de dire qu'un post c'est aussi un contexte :
    Comment il fait le gars avec sa machine... pour ne pas utiliser des ressources qu'il n'a pas et pour faire tous ces tests. $
    C'est donc le problème des deux derniers posts.
    Sinon, une bête addition et hop basta problemo

Discussions similaires

  1. Lancer un programme, mais sur une autre machine
    Par GOUGOU1 dans le forum Réseau
    Réponses: 12
    Dernier message: 08/12/2002, 20h36
  2. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 17h59
  3. Réponses: 4
    Dernier message: 10/09/2002, 17h09
  4. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58

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