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 :

Multiplication hexadécimale [FAQ]


Sujet :

Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 156
    Par défaut Multiplication hexadécimale
    Bonjour,
    Je voudrais savoir comment s'effectue une multiplication en hexadecimal du genre :
    C2B149
    * 68C5A

    Est ce qe l'on effectue la multiplication comme en base 10; mais alors que fait-on des retenues; par exemple 9*A = 5A, est-ce que 5 est la retenue ?
    qu'en fait on ?
    ou bien l'on convertit en base 2
    Bien sûr je peux utiliser la calculatrice mais je veux comprendre la multiplication en base 16

    Merci d'avance pour toute aide

  2. #2
    Membre Expert
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Par défaut
    Bonjour

    Oui la multiplication se passe comme en base 10.
    Prenons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         C2B
       * 68C
      ------
        9204  (1)
    +  6158.  (2)
    + 4902..  (3)
      ------
      4FA984  (4)
    (1) - On effectue C2B * C de cette manière :
    B*C = 84, j'écris 4 je retiens 8
    2*C = 18, 18 + 8 = 20, j'écris 0 je retiens 2
    C*C = 90, 90 + 2 = 92, j'écris 92
    D'où C2B * C = 9204

    (2) - On effectue C2B * 80, ce qui revient à faire C2B * 8 et décaler d'un rang vers la gauche le résultat :
    B*8 = 58, j'écris 8 je retiens 5
    2*8 = 10, 10 + 5 = 15, j'écris 5 je retiens 1
    C*8 = 60, 60 + 1 = 61, j'écris 61
    D'où C2B * 8 = 6158 et donc C2B * 80 = 61580 (le zéro rajouté correspond au point ci dessus)

    (3) - On effectue C2B * 600, ce qui revient à faire C2B * 6 et décaler de 2 rangs vers la gauche le résultat
    [... même raisonnement ...]
    On obtient C2B * 600 = 490200

    (4) - On effectue (1) + (2) + (3) :
    4 + 0 + 0 = 4
    0 + 8 + 0 = 8
    2 + 5 + 2 = 9
    9 + 1 + 0 = A
    6 + 9 = F
    4 = 4
    On obtient le bon résultat : C2B * 68C = 4FA984

    Le fait d'être en base 16 ne change pas les règles de distributivité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C2B * 68C = C2B * (600 + 80 + C)
              = (C2B * 600) + (C2B * 80) + (C2B * C)
              = (C2B * 6 * 100) + (C2B * 8 * 10) + (C2B * C)

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Par défaut
    Bonjour,
    C'est la première fois que je poste ici.
    Premièrement, excusez-moi pour mes fautes d'orthographe car je suis españole.
    Voilà, je commence à étudier l´assembleur et justement je devais faire cet exercice : multiplier FB x 0E
    ceci avec AVRStudio puisque cela se fait pour un atmel

    Je suis très débutante dans cela.
    Pourrais-je vous demander comment faire ce même code de la même façon que comme en base 10 ?
    Voici comment je l'ai fait en aditionnant FBx14
    mais j'aimerais bien essayer de le faire de votre façon

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    ;------------------------------------------------------ 
    ; FICHERO: Curso De Apaños .Ejercicio 2B asm 
    ; Multiplicar en HEXADECIMAL FB x 0E  
    ; El resultado debe quedar en RAM a partir de la dirección 0x110 
    ;------------------------------------------------------ 
    ; Declaraciones estandar para este micro AT90S8515: 
    	.include "8515def.inc"
    ;-------------------------------------------------------------- 
    ; Definicion de constantes y variables 
    ; Pensamiento de Forma Global 
    ;-------------------------------------------------------- 
    ; 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*****
     
     
    ldi r29,0xFB ;registro 1=FB
    ldi r28,0x00 ;registro 0=00
    ldi r27,0x0E ;registro 2=0E
    ldi r26,0xFB ;registro 3= registro 1=FB
    ldi r25,0x00 ;registro 0=00
     
     
    clr r29      ;Limpio el registro y lo pongo a 00
    add r29,r26  ;Le Sumo FB a 00
    dec r27      ;Decremento 0E 1 vez
    adc r28,r28  ;aqui Sumo Fb + 00 de momento no tengo accareo
                 ;pero mas adelante si lo tengo asi que lo guardo aqui
    cpi r27,0x00 ;Comparo 0D con 00 ya que e 
                 ;decrementado 0E anteriormente (0E -1=0D)
     
    brne Sumo    ;Como 0D no es igual 00 Salto y Sumo
     
    Sumo:
     
    subi r27,$01 ;registro 2 = registro 2-1
    adc r29,r26  ;registro 1 = registro 1 + registro 3
    adc r28,r25  ;Accareo
    cpi r27,0x00 ;si registro 2 es distinto de cero 
                 ;sigo en el bucle, sino me salgo
    brne Sumo
     
    Arriba:
                  ;ya que tenemos como resultado 0DBA
    sts 0x110,r28 ;aqui coloco 0D que es el MSB del World 
                  ;en la direcion 110 de la Ram 
    sts 0x111,r29 ;aqui coloco BA que es el LSB del World 
                  ;en la direcion 111 de la Ram                             
    		rjmp stop   
     
     
    ;****HASTA AQUÍ VUESTRO CODIGO******** 
     
     
     
    STOP:        rjmp        STOP   ;FIN DEL PROGRAMA
    Merci pour votre reponse

  4. #4
    Membre éprouvé Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Par défaut
    Bienvenue !

    Tu écris très bien le français !
    Je n'y connait rien en Atmel mais je crois que s'il n'y a pas une instruction permettant de faire directement la multiplication, une boucle est effectivement le seul moyen...
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Nico*3-3
    je crois que s'il n'y a pas une instruction permettant de faire directement la multiplication, une boucle est effectivement le seul moyen...
    Des decalages et des additions (autrement dit l'algo classique mais en base 2).

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Par défaut
    E bien voilà j'ai trouvé la solution
    Merci beaucoup pour ce magnifique forum
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    ;------------------------------------------------------ 
    ; FICHERO: ejercicios.asm 2E
    ; Multiplicar Dos Worlds
    ; r21:r20 x  r19:r18	 =  r23:r22:r21:r20
    ; C2 : B0 *  68 : C0    =   4F  A9  84  00    
    ;------------------------------------------------------ 
    ; 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	r23
    clr	r22
     
    ldi r21,0xC2
    ldi r20,0xB0
    ldi r19,0x68
    ldi r18,0xC0
    ldi r16,0x10 ; Comparo 16 veces
     
    cpi r16, 0x00
    brcc Sumo 
     
    Sumo:
     
    cpi r16, 0x00
    brlt Fin
    ror	r23    
    ror	r22 
    ror	r21    
    ror	r20     
    dec r16
    brcs Sumo1
    brcc Sumo
     
    Sumo1:
     
    add	r22,r18
    adc	r23,r19
    ror	r23    
    ror	r22 
    ror	r21    
    ror	r20  
    dec r16
    brcc Sumo
    brcs Sumo1
     
    Fin:
     
    ;****HASTA AQUÍ VUESTRO CODIGO********

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

Discussions similaires

  1. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  2. Multiple Count
    Par Antichoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2003, 11h19
  3. formulaire choix multiple
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 02/02/2003, 18h59
  4. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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